“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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!