使用-ErrorAction Stop标志时捕获最后一个内部异常

时间:2018-05-30 13:17:49

标签: powershell exception-handling

以下是代码:

Try{
    $connection = Test-Connection -BufferSize 32 -Count 1 -ErrorAction Stop -ComputerName "test"
    return $connection.StatusCode.ToString()
}
Catch [System.Net.NetworkInformation.PingException]{
    return "Ping Exception"
}
Catch [Exception]{
    return "Unexpected exception"
}

现在,让我们考虑一下-ComputerName找不到的情况,这会给我一个System.Net.NetworkInformation.PingException。但是,在上面的代码中,输出将是Unexpected exception

参考this回答,我应该使用System.Management.Automation.ActionPreferenceStopException来抓住它。

现在我的问题是,在使用-ErrorAction Stop标志时如何捕获最后一个内部异常。我应该抛出PingException吗?它似乎不是一个好主意,因为我不能确定PinException确实是ErrorAction触发器的原因。

1 个答案:

答案 0 :(得分:1)

事实证明,当使用-ErrorAction Stop标志时,非终止错误将被包装并作为类型System.Management.Automation.ActionPreferenceStopException抛出。因此,解决方案是像这样遍历异常树

Try{
    $connection = Test-Connection -BufferSize 32 -Count 1 -ErrorAction Stop -ComputerName "test"
    return $connection.StatusCode.ToString()
}
Catch [System.Management.Automation.ActionPreferenceStopException]{
    $exception = $_.Exception
    #Walk through Exception tree
    while ($exception.InnerException) {
      $exception  = $exception.InnerException
    }
    #Return only the last inner exception
    return $exception.Message
}
Catch [Exception]{
    return "Unexpected exception"
}

修改

请注意,我的代码将最后一个内部异常消息作为字符串返回。如果需要,可以使用相同的逻辑来查找其他信息。