使用 -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 作为字符串返回。如果需要,可以使用相同的逻辑来查找其他信息。
代码如下:
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 作为字符串返回。如果需要,可以使用相同的逻辑来查找其他信息。