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

Oz *_*aim 7 .net powershell exception-handling divide-by-zero powershell-2.0

在我的机器上,以下每个代码片段抛出异常而不是打印到标准输出"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
}
Run Code Online (Sandbox Code Playgroud)

Lie*_*ers 13

当您使用常量时,解释器会尝试预先计算结果并失败并显示除零错误.你的代码甚至没有被执行,所以没有什么可以陷阱.

您可以通过更改代码以使用变量来强制执行此操作来自行验证.

try {
    $divisor = 0
    [int]$a = 1/$divisor
}
catch {
    write 1
}
finally {
    write 2
}
Run Code Online (Sandbox Code Playgroud)

Windows PowerShell实施(p.257)

这里的示例使用1/$ null.这样做的原因而不仅仅是1/0是因为PowerShell解释器执行了一个称为常量表达式折叠的东西.

它查看仅包含常量值的表达式.当它看到一个时,它会在编译时对该表达式进行一次计算,因此它不必浪费时间在运行时再次执行它.

这意味着不可能的表达式,例如除以零,被捕获并被视为解析错误.解析错误无法捕获,并且在交互式输入时不会被记录,因此它们不是一个很好的例子.(如果一个脚本调用另一个脚本并且该脚本具有这些错误之一,则调用脚本可以捕获它,但是正在解析的脚本不能.)