PowerShell - 为什么“除以零例外”没有被抓住?

时间:2012-05-16 12:36:09

标签: .net powershell exception-handling powershell-v2.0 divide-by-zero

在我的机器上,以下每个代码片段都抛出异常,而不是打印到标准输出" 1"和" 2" 为什么异常没有被抓住?

try {
    [int]$a = 1/0
}
catch {
    write 1
}
finally {
    write 2
}

try {
    [int]$a = 1/0
}
catch [System.Exception] {
    write 1
}
finally {
    write 2
}

3 个答案:

答案 0 :(得分:12)

当您使用常量时,解释器会尝试预先计算结果并失败并显示除零错误。你的代码甚至没有被执行,因此无需陷阱。

您可以通过更改代码以使用变量来强制执行此操作来验证这一点。

try {
    $divisor = 0
    [int]$a = 1/$divisor
}
catch {
    write 1
}
finally {
    write 2
}

Windows PowerShell实际操作(第257页)

  

此处的示例使用1 / $ null。这样做的原因而不是   简单的1/0是因为PowerShell解释器执行了一些调用   恒定表达折叠。

     

它查看仅包含常量值的表达式。当它   看到一个,它在编译时对表达式进行一次计算   不必浪费时间在运行时再次这样做。

     

这意味着不可能的表达,例如除以零,是   被捕获并被视为解析错误。无法捕获解析错误   并且当他们以交互方式进入时不会被记录,所以他们没有   做一个很好的例子。 (如果一个脚本调用另一个脚本,那么   脚本有这些错误之一,调用脚本可以捕获它,但是   正在解析的脚本不能。)

答案 1 :(得分:4)

v2中的RuntimeException无法捕获。它已在v3中修复。

除以零属于此类别。

答案 2 :(得分:1)

您可以尝试使用这种行抛出异常:trap { "Your Exception" } 1/0
这将抛出异常“除以0”。虽然我不太明白为什么你的代码不会抛出异常._。
PS:这不应该是catch [System.SystemException]吗? :)