PowerShell - Why “Divide By Zero Exception” is not being Caught?

别等时光非礼了梦想. 提交于 2019-11-28 03:44:39

问题


On my Machine each one of the following code snippets throws and exception instead of printing to the standard output "1" and "2" Why the exception is not being Caught?

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:


As you are using constants, the interpreter tries to precompute the result and fails with a division by zero error. Your code does not even get executed so there's nothing to trap.

You can verify this for yourself by changing your code to use variables, forcing it to be executed.

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

From Windows PowerShell in Action (p.257)

The example here uses 1/$null. The reason for doing this instead of simply 1/0 is because the PowerShell interpreter does something called constant expression folding.

It looks at expressions that contain only constant values. When it sees one, it evaluates that expression once at compile time so it doesn’t have to waste time doing it again at runtime.

This means that impossible expressions, such as division by zero, are caught and treated as parsing errors. Parsing errors can’t be caught and don’t get logged when they’re entered interactively, so they don’t make for a good example. (If one script calls another script and that script has one of these errors, the calling script can catch it, but the script being parsed cannot.)




回答2:


RuntimeException in v2 are not catchable. It has been fixed in v3.

Dividing by zero falls into this category.




回答3:


You can try to throw an exception with that kind of line : trap { "Your Exception" } 1/0
This will throw the exception "divide by 0". Though I don't really understand why your code doesn't throw an exception ._.
PS : Isn't that supposed to be catch [System.SystemException] ? :)



来源:https://stackoverflow.com/questions/10618676/powershell-why-divide-by-zero-exception-is-not-being-caught

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!