以下是代码:
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
触发器的原因。
答案 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"
}
修改强>
请注意,我的代码将最后一个内部异常消息作为字符串返回。如果需要,可以使用相同的逻辑来查找其他信息。