在我的机器上,以下代码片段中的每一个都抛出异常,而不是打印到标准输出“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
}
在我的机器上,以下代码片段中的每一个都抛出异常,而不是打印到标准输出“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
}
当您使用常量时,解释器会尝试预先计算结果,并因除以零错误而失败。您的代码甚至没有被执行,所以没有什么可以捕获的。
您可以通过更改代码以使用变量来自己验证这一点,强制执行它。
try {
$divisor = 0
[int]$a = 1/$divisor
}
catch {
write 1
}
finally {
write 2
}
来自Windows PowerShell实战 (p.257)
此处的示例使用 1/$null。这样做而不是简单的 1/0 的原因是因为 PowerShell 解释器做了一些称为常量表达式折叠的事情。
它查看仅包含常量值的表达式。当它看到一个时,它会在编译时评估该表达式一次,因此它不必浪费时间在运行时再次执行它。
这意味着不可能的表达式,例如被零除,将被捕获并视为解析错误。解析错误无法被捕获,也不会在交互式输入时被记录,因此它们不是一个很好的例子。(如果一个脚本调用另一个脚本并且该脚本有这些错误之一,则调用脚本可以捕获它,但被解析的脚本不能。)
v2 中的 RuntimeException 不可捕获。它已在 v3 中修复。
除以零属于这一类。
您可以尝试使用这种行引发异常:trap { "Your Exception" } 1/0
这将引发异常“除以 0”。虽然我真的不明白为什么你的代码不会抛出异常._。
PS:不应该是这样catch [System.SystemException]
吗?:)