Powershell 理解异常


“Exception”并不是每天都会遇到。但是在当今的IT世界里,”Errors”和”Bugs”往往是可以避免的。当一个error发生时,程序会通过抛出一个异常来弥补。作为上层的调用者,最好能对捕获和处理潜在的异常,否则在Powershell控制台上会红色高亮显示出错。
但是在Powershell中$Error中元素的类型为:错误记录。每个Error元素的中包含属性Exception,这个Exception和.NET中的Exception对应。

#查看最后的异常
$Error[0].Exception.Message
#找不到路径“Cddd”,因为该路径不存在。

#列出当前Error变量中存储的Exception类型
#当$Error中Exception为null时,不能调用Message,否则会报错。
$Error | where {$_.Exception -ne $null} | foreach {$_.Exception.GetType().fullName }
System.Management.Automation.RuntimeException
System.Management.Automation.RuntimeException
System.Management.Automation.ItemNotFoundException
System.Management.Automation.CommandNotFoundException

处理特定的异常

在使用Trap处理异常时,可以像.NET中的Try一样捕获特定的异常,并且做特定的处理。

Trap [System.DivideByZeroException] {
"除数为空!";
Continue
}
Trap [System.Management.Automation.ParameterBindingException] {
"参数不正确!";
Continue
}

Trap [System.Net.WebException]{
"网络异常!"
Continue
}

1/$null
Dir -MacGuffin
$wc = new-object System.Net.WebClient
$wc.DownloadFile("http://www.mossfly.com/powershell.txt","e:ps.txt")

#除数为空!
#参数不正确!
#网络异常!

抛出自定义异常信息

如果你想抛出自己的异常信息,可以通过Throw关键字,下面的例子验证第二个参数的传入的值,如果传入的值为NULL,抛出异常。

Function Func-Test($a,$b)
{
if($b -eq $null)
{
throw "参数b 不能为空!"
}
"{0}+{1}={2}" -f $a,$b,($a+$b)
}
Func-Test -a 10

参数b 不能为空!
所在位置 E:MyScript.ps1:6 字符: 10
+ throw <<<< "参数b 不能为空!"
+ CategoryInfo : OperationStopped: (参数b 不能为空!:String) [], RuntimeException
+ FullyQualifiedErrorId : 参数b 不能为空!

上面的函数的参数检查可以参数定义中效果会更好,即给参数设定默认值,默认的值就是抛出一个异常,如果没有传入的参数,会以默认值为准,也就是抛出异常。

Function Func-Test($a,$b=$(throw "参数B 不能为空!"))
{
"{0}+{1}={2}" -f $a,$b,($a+$b)
}
Func-Test -a 10 -b 9
Func-Test -a 10

#输出结果
10+9=19
参数B 不能为空!
所在位置 E:MyScript.ps1:2 字符: 33
+ Function Func-Test($a,$b=$(throw <<<< "参数B 不能为空!"))
+ CategoryInfo : OperationStopped: (参数B 不能为空!:String) [], RuntimeEx
ception
+ FullyQualifiedErrorId : 参数B 不能为空!
本文链接: https://www.pstips.net/powershell-understand-exception.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

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

发表评论

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