【问题标题】:PowerShell catching typed exceptionsPowerShell 捕获类型异常
【发布时间】:2011-12-05 05:08:51
【问题描述】:

我遇到了 PowerShell 的问题,即使在 catch 命令中明确提及异常,它也不会捕获异常。

在这种情况下,我试图确定 ProcessID 是否仍在运行,如果没有,它将采取一些措施。

我正在努力的示例代码块是:

    try {
      Get-Process -Id 123123 -ErrorAction 'Stop'
    } 
    catch [Microsoft.PowerShell.Commands.ProcessCommandException] {
      "Caught by Exception Type: Process is missing"
    }
    catch {
    if ($_.Exception.getType().FullName -eq "Microsoft.PowerShell.Commands.ProcessCommandException") {
      "Caught by Catch All: Process is missing"
      }
    }

执行此代码块时,输出为:

Caught by Catch All: Process is missing

您会期望触发第一个 catch 条件,因为它命名了正确抛出的异常,但它没有触发。

更糟糕的是,当第二个 catch 命令运行(它捕获任何东西)时,它会查询异常类型的名称并检查它是否是“Microsoft.PowerShell.Commands.ProcessCommandException”(它是),然后采取适当的步骤。

我知道我可以解决这个问题,但我觉得我缺少关于 PowerShell 如何处理异常的基本方法。

谁能帮我解释一下?

【问题讨论】:

    标签: exception powershell


    【解决方案1】:

    当您将 ErrorAction 设置为 Stop 时,非终止错误将被包装并作为类型抛出 System.Management.Automation.ActionPreferenceStopException,这是您要捕获的类型。

    try 
    {
        Get-Process -Id 123123 -ErrorAction Stop
    } 
    catch [System.Management.Automation.ActionPreferenceStopException]
    {
        ... do something ...
    }
    

    【讨论】:

    • 非常感谢,就是这样。我确信它被包裹在某些东西中,但是对于我的一生,我无法确定包裹异常类型是什么。至少一旦以这种方式捕获,我可以查询 .getType().FullName 以验证错误类型。有趣的是,使用-ErrorAction 'Stop'$ErrorActionPreference = 'Stop' 结果都一样。
    • 是的,我更喜欢在 cmdlet 级别更改它,这样我就不需要在每次更改全局值时都恢复它的值..
    • 嗨,有没有关于我们如何从广义对象类型 'Microsoft.PowerShell.Commands.ProcessCommandException' 到 'System.Management.Automation.ActionPreferenceStopException' 的解释?我正在尝试捕获另一个类或错误的异常并陷入与@david-thomas 相同的位置。
    • @ShayLevy 如果您希望脚本在发生错误时停止执行,是否有任何方法可以捕获类型异常?我们经常设置ErrorActionPreference 变量来让我们的脚本停止执行。在这种情况下,我如何检查异常类型?
    • 7年后:看来powershell不再包装这些异常了,可以捕捉到真正的异常类型..
    【解决方案2】:

    可能是因为您缺少错误操作

    try 
    { 
        kill 1234567 -ErrorAction Stop 
    } 
    catch 
    { 
        Write-Host "Blam!" 
    }
    

    【讨论】:

    • 您能否提供更多关于您的解决方案如何解决问题的说明。
    猜你喜欢
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2010-10-08
    • 2015-11-17
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    相关资源
    最近更新 更多