合理运用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,<strong>Microsoft.PowerShell.Commands.GetProcessCommand</strong>

我们可以从如上返回的错误信息中发现它属于一个什么异常类型,但是这里所显示的异常未必符合一个标准的类型。不信?我们可以把该异常类型放进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!






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值