合理运用PowerShell中的异常处理类型

在用PowerShell写脚本的时候,几乎可以说没有一个人没有遇到过一个报错。通常在我们遇到报错或者潜在可能报错的时候,我们都会在代码逻辑里设置错误异常捕捉处理。

PowerShell里的错误异常捕捉处理和C#里的一样支持Try,Catch,Finally来处理。不过我想大部分人都会在使用TryCatch捕捉错误的时候,直接使用Catch语句块捕获全部的异常,对于如果想把交互式脚本写的更佳细腻,对错误异常的捕获也需要更佳细腻而不是一箩筐的把所有的异常都捕获。

举个例子如下,我们随便查看一个ProcessName,当然他是不存在的,所以PowerShell返回了一个错误给我们。

PS C:\Users\Administrator> Get-Process -Name "abc"
Get-Process : Cannot find a process with the name "abc". Verify the process name and call the cmdlet again.
At line:1 char:1
+ Get-Process -Name "abc"
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (abc:String) [Get-Process], ProcessCommandException
    + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.GetProcessCommand

我们可以从如上返回的错误信息中发现它属于一个什么异常类型,但是这里所显示的异常未必符合一个标准的类型。不信?我们可以把该异常类型放进Catch语句块里使用试试:

Try
{
    Get-Process -Name "abc" -ErrorAction Stop
}
catch [Microsoft.PowerShell.Commands.GetProcessCommand]
{
    Write-Verbose -Verbose "The process name does not exist!"
}
catch
{
    Write-Verbose -Verbose "Name Error!"
}

得到结果如下:

VERBOSE: Name Error!

显然它并没有完全精准的捕获具体错误,那么真正的错误类型是什么呢?我们可以通过如下代码一查究竟:

PS C:\Users\Administrator> ($Error[0] | Select -Property *).Exception.GetType().FullName
Microsoft.PowerShell.Commands.ProcessCommandException

我们使用$Error保留变量读取了当前指定的代码错误,然后通过提取具体的异常获得了真正的异常错误类型,那Microsoft.PowerShell.Commands.ProcessCommandException才是我们真正需要的错误类型,我们接着再次使用这个类型判断试试:

PS C:\Users\Administrator> Try
{
    Get-Process -Name "abc" -ErrorAction Stop
}
catch [Microsoft.PowerShell.Commands.ProcessCommandException]
{
    Write-Verbose -Verbose "The process name does not exist!"
}
catch
{
    Write-Verbose -Verbose "Name Error!"
}

得到了正确的结果,这正是我们想要得到的效果!

VERBOSE: The process name does not exist!







你可能感兴趣的:(合理运用PowerShell中的异常处理类型)