【问题标题】:PowerShell - Why "Divide By Zero Exception" is not being Caught?PowerShell - 为什么“除以零异常”没有被捕获?
【发布时间】:2012-05-16 12:36:09
【问题描述】:

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

【问题讨论】:

    标签: .net powershell exception-handling powershell-2.0 divide-by-zero


    【解决方案1】:

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

    您可以自己验证这一点,方法是更改​​代码以使用变量,强制执行它。

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

    来自 Windows PowerShell 实战 (p.257)

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

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

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

    【讨论】:

      【解决方案2】:

      v2 中的 RuntimeException 无法捕获。它已在 v3 中修复。

      除以零属于这一类。

      【讨论】:

      • 所以...我的错。 :) 这不是 RuntimeException。我刚刚复制了FullyQualifiedErrorId,其中不包含对该场景重要的细节。关于 v3:我找不到任何参考(还)。 Doug Finke 在他即将出版的“PowerShell for Developers”一书中提到了这个计算作为例子,所以我尝试并意识到在 v3 中它实际上可以被捕获。对于因使用错误的术语而造成的任何混乱,我们深表歉意... :)
      • 感谢更新。如果您找到参考,我希望您仍将其发布在此处。
      • 好的,不知道为什么我没有早点发现这一点...查看 WMF 3.0 发行说明,第 13 页。有关此特殊情况的信息:“在解析期间不执行常量折叠。 "后来,在错误消息列中“没有解析。在运行时检测到错误”。显然,这样我们就有可能捕捉到这个错误。您可以在此处找到 WMF 3.0 RC 的发行说明:microsoft.com/en-us/download/details.aspx?id=29939
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-18
        • 2014-08-16
        • 1970-01-01
        • 2010-11-16
        • 2012-01-22
        • 1970-01-01
        相关资源
        最近更新 更多