8

在我的机器上,以下代码片段中的每一个都抛出异常,而不是打印到标准输出“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
}
4

3 回答 3

13

当您使用常量时,解释器会尝试预先计算结果,并因除以零错误而失败。您的代码甚至没有被执行,所以没有什么可以捕获的。

您可以通过更改代码以使用变量来自己验证这一点,强制执行它。

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

来自Windows PowerShell实战 (p.257)

此处的示例使用 1/$null。这样做而不是简单的 1/0 的原因是因为 PowerShell 解释器做了一些称为常量表达式折叠的事情。

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

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

于 2012-05-16T12:48:41.660 回答
4

v2 中的 RuntimeException 不可捕获。它已在 v3 中修复。

除以零属于这一类。

于 2012-05-16T12:56:44.967 回答
1

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

于 2012-05-16T12:39:10.057 回答