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

Catch last inner exception when using the -ErrorAction Stop flag

代码如下:

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 的情况,这将 return 我 System.Net.NetworkInformation.PingException。但是,在上面的代码中,输出将是 Unexpected exception.

参考this回答,我应该用System.Management.Automation.ActionPreferenceStopException来捕捉。

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

事实证明,当使用 -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"
}

编辑

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