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解释器执行了一个称为常量表达式折叠的东西.
它查看仅包含常量值的表达式.当它看到一个时,它会在编译时对该表达式进行一次计算,因此它不必浪费时间在运行时再次执行它.
这意味着不可能的表达式,例如除以零,被捕获并被视为解析错误.解析错误无法捕获,并且在交互式输入时不会被记录,因此它们不是一个很好的例子.(如果一个脚本调用另一个脚本并且该脚本具有这些错误之一,则调用脚本可以捕获它,但是正在解析的脚本不能.)
| 归档时间: |
|
| 查看次数: |
3218 次 |
| 最近记录: |