在我的机器上,以下每个代码片段都抛出异常,而不是打印到标准输出" 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
}
答案 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]
吗? :)