Powershell 捕获异常类型
Powershell catching exception type
有没有一种方便的方法来捕获异常类型和内部异常以用于 try-catch 目的?
示例代码:
$a = 5
$b = Read-Host "Enter number"
$c = $a / $b #error if $b -eq 0
$d = get-content C:\I\Do\Not\Exist
第 3 行将生成带有内部异常的运行时错误(编辑:修复了此命令 $Error[1].Exception.InnerException.GetType()),第 4 行将生成 "standard"( ?) 异常类型 ($Error[0].Exception.GetType()).
是否可以使用同一行代码从这两个方面获得所需的结果?
Ad1:第 3 行出错
At -path-:3 char:1
+ $c = $a / $b #error if $b -eq 0
+ ~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
Ad2:第 4 行出错
get-content : Cannot find path 'C:\I\Do\Not\Exist' because it does not exist.
At -path-:4 char:6
+ $d = get-content C:\I\Do\Not\Exist
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\I\Do\Not\Exist:String)
[Get-Content], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
编辑:为了清楚起见,我希望结果以某种方式 return DivideByZeroException 和 ItemNotFoundException
您是否正在尝试捕获像这样的特定错误类型?
https://blogs.technet.microsoft.com/poshchap/2017/02/24/try-to-catch-error-exception-types/
首先,可以显式捕获特定的异常类型:
$ErrorActionPreference = "Stop"
try {
1 / 0
}
catch [System.DivideByZeroException] {
$_.Exception.GetType().Name
}
try {
Get-Item "c:\does-not-exist"
}
catch [System.Management.Automation.ItemNotFoundException] {
$_.Exception.GetType().Name
}
DivideByZeroException
基本上就是RuntimeException
的InnerException,理论上InnerExceptions可以无限嵌套:
catch {
$exception = $_.Exception
do {
$exception.GetType().Name
$exception = $exception.InnerException
} while ($exception)
}
BUT 您可以将 RuntimeException
作为特例处理。甚至 PowerShell 也是如此。查看第一个代码示例。即使指定了 inner 异常的类型,也会到达 catch 块。
您可以自己做类似的事情:
catch {
$exception = $_.Exception
if ($exception -is [System.Management.Automation.RuntimeException] -and $exception.InnerException) {
$exception = $exception.InnerException
}
$exception.GetType().Name
}
注意如果你想捕获两个异常,你需要每个命令一个 try-catch。否则,如果第一个失败,第二个将不会被执行。您还必须指定 $ErrorActionPreference
到 "Stop"
以捕获非终止异常。
有没有一种方便的方法来捕获异常类型和内部异常以用于 try-catch 目的?
示例代码:
$a = 5
$b = Read-Host "Enter number"
$c = $a / $b #error if $b -eq 0
$d = get-content C:\I\Do\Not\Exist
第 3 行将生成带有内部异常的运行时错误(编辑:修复了此命令 $Error[1].Exception.InnerException.GetType()),第 4 行将生成 "standard"( ?) 异常类型 ($Error[0].Exception.GetType()).
是否可以使用同一行代码从这两个方面获得所需的结果?
Ad1:第 3 行出错
At -path-:3 char:1
+ $c = $a / $b #error if $b -eq 0
+ ~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
Ad2:第 4 行出错
get-content : Cannot find path 'C:\I\Do\Not\Exist' because it does not exist.
At -path-:4 char:6
+ $d = get-content C:\I\Do\Not\Exist
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\I\Do\Not\Exist:String)
[Get-Content], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
编辑:为了清楚起见,我希望结果以某种方式 return DivideByZeroException 和 ItemNotFoundException
您是否正在尝试捕获像这样的特定错误类型?
https://blogs.technet.microsoft.com/poshchap/2017/02/24/try-to-catch-error-exception-types/
首先,可以显式捕获特定的异常类型:
$ErrorActionPreference = "Stop"
try {
1 / 0
}
catch [System.DivideByZeroException] {
$_.Exception.GetType().Name
}
try {
Get-Item "c:\does-not-exist"
}
catch [System.Management.Automation.ItemNotFoundException] {
$_.Exception.GetType().Name
}
DivideByZeroException
基本上就是RuntimeException
的InnerException,理论上InnerExceptions可以无限嵌套:
catch {
$exception = $_.Exception
do {
$exception.GetType().Name
$exception = $exception.InnerException
} while ($exception)
}
BUT 您可以将 RuntimeException
作为特例处理。甚至 PowerShell 也是如此。查看第一个代码示例。即使指定了 inner 异常的类型,也会到达 catch 块。
您可以自己做类似的事情:
catch {
$exception = $_.Exception
if ($exception -is [System.Management.Automation.RuntimeException] -and $exception.InnerException) {
$exception = $exception.InnerException
}
$exception.GetType().Name
}
注意如果你想捕获两个异常,你需要每个命令一个 try-catch。否则,如果第一个失败,第二个将不会被执行。您还必须指定 $ErrorActionPreference
到 "Stop"
以捕获非终止异常。