Powershell 识别和处理异常 3


如果你想对错误处理,并且输出友好的信息。须要两点:
第一,抑制内置的错误信息;
第二,一个能够发现异常是否发生的机制。
在之前的文章中我们已经知道怎样抑制内置的错误消息了,是通过ErrorAction。你如果将ErrorAction设置为“SilentlyContinue”,错误信息就不会输出了。

Remove-Item "文件不存在" -ErrorAction "SilentlyContinue"

$?中的错误状态
$?变量会保存上一步操作是否成功或者失败,也就是告诉你是否发生了错误。可以写一段脚本进行测试。

Remove-Item "文件不存在" -ErrorAction "SilentlyContinue"
If (!$?)
{
"删除文件操作失败";
break
};
"删除文件成功!"

#删除文件操作失败

因为文件不存在,所在Remove-Item失败,失败异常标志$?会变为$false。语句块 !$? 的值会变为$true,进而提示删除文件失败。如果你喜欢像正常的输出一样,将异常的message输出。

Remove-Item "文件不存在" -ErrorAction "SilentlyContinue"
If (!$?)
{
"发生异常,异常信息为$($error[0])";
break
}
"删除文件成功!"
# 发生异常,异常信息为:找不到路径“E:文件不存在”,因为该路径不存在。

使用Traps

使用Traps可以捕获异常,在捕获到异常时,可以在做相应的处理。例如我们在Powershell自动化工作中,出现了异常可以发一封邮件给管理员。

Trap { "自动化工作发生异常,正在发邮件联系管理员给管理员!"}
1/$null

自动化工作发生异常,正在发邮件联系管理员给管理员!
试图除以零。
所在位置 行:4 字符: 3
+ 1/ <<<< $null
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException

到目前为止,并没有对异常进行处理。

Traps未处理的异常

上面的异常发生在运行时,但是有的异常发生在编译时,例如:

Trap {"我想捕获异常"}
1/0
试图除以零。
所在位置 行:2 字符: 44
+ Trap { "A dreadful error has occurred!"} 1/ <<<< 0
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordExc
eption
+ FullyQualifiedErrorId : RuntimeException

这次Trap没有生效,因为0为常量,该异常会在编译时被抛出,并且Traps对此无能为力。但是对于cmdlets中内部异常却可以捕获。

PS> Trap {"我想捕获异常"}
PS> 1/0
我想捕获异常
尝试除以零。
所在位置 行:1 字符: 17
+ Trap {"我想捕获异常"};1/0
+                 ~~~
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException
使用Break和Continue来对异常作后续处理

Traps异常发生时使用break中断脚本执行

Trap { "异常发生,我想终止脚本!" }
stop-service -name "NoSuchService" -ErrorAction "Stop"
异常发生,我想终止脚本!
Stop-Service : 找不到任何服务名称为“NoSuchService”的服务。
所在位置 行:3 字符: 13
+ stop-service <<<< -name "NoSuchService" -ErrorAction "Stop"
+ CategoryInfo : ObjectNotFound: (NoSuchService:String) [Stop-Ser
vice], ServiceCommandException
+ FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.
Commands.StopServiceCommand
Traps异常发生时,使用Continue 继续执行
Trap { "异常发生,我要继续执行!" }
stop-service -name "NoSuchService" -ErrorAction "Stop"
Write-Host "继续执行"

异常发生,我要继续执行!
Stop-Service : 找不到任何服务名称为“NoSuchService”的服务。
所在位置 行:3 字符: 13
+ stop-service <<<< -name "NoSuchService" -ErrorAction "Stop"
+ CategoryInfo : ObjectNotFound: (NoSuchService:String) [Stop-Service], ServiceCommandException
+ FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.
Commands.StopServiceCommand
继续执行

查看异常的详细信息

Trap 到异常后,Powershell会自动将该异常保存在$_变量中。

Trap
{
Write-Host $_.Exception.Message;
Continue
};
Stop-Process -Name "NoSuchProcess"

Stop-Process : 找不到名为“NoSuchProcess”的进程。请验证该进程名称,然后再次调用 cmdlet。
所在位置 行:6 字符: 13
+ Stop-Process <<<< -Name "NoSuchProcess"
+ CategoryInfo : ObjectNotFound: (NoSuchProcess:String) [Stop-Process], ProcessComman
dException
+ FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.StopProcess
Command
本文链接: https://www.pstips.net/powershell-recognize-and-response-errors.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

3 条评论 “Powershell 识别和处理异常

  • jimhuang

    Trap
    {
    Write-Host $_.Exception.Message;
    Continue
    };
    Stop-Process -Name “NoSuchProcess”

    最后一句,Stop-Process -Name “NoSuchProcess” 加上 -ErrorAction Stop跑起来才有feel.