前几天CodeCook分享了两篇文章《隐藏PowerShell终止错误 》和《捕获PowerShell非终止的错误 》,我当时看完了以后心里还是有点犯嘀咕,什么是终止错误?,什么是非终止错误?为什么Invoke-WebRequest中的ErrorAction没用?
先总结一下:
- 由ThrowTerminatingError方法抛出的是终止错误,终止错误可以通过try-catch隐藏
- 由WriteError方法抛出的是非终止错误,非终止错误可以通过ErrorAction捕获
现在就深入PowerShell命令内部来演示,帮助大家加深印象。
我自定义一个PowerShell命令Test-Url,当传入的url中包含fuck关键字时,抛出一个非终止错误。当请求url资源,状态码不是200时,像Invoke-WebRequest那样抛出一个终止错误。
注意看C#代码:
using System.IO; using System.Net; using System.Management.Automation; namespace PStips.Net { [Cmdlet("Test", "Url")] public class TestUrlCommand : Cmdlet { private string url; //声明参数为强制 [Parameter(Mandatory = true)] public string URl { get { return url; } set { url = value; } } protected override void ProcessRecord() { if(this.URl.Contains("fuck")) { //抛出一个非终止错误 WriteError(new ErrorRecord( new InvalidOperationException("对不起,您输入的URL连接不文明"), "非终止错误", ErrorCategory.SecurityError, this.URl )); } try { var webClient = new WebClient(); WriteObject(webClient.DownloadString(this.URl)); } catch(WebException ex) { //抛出一个终止错误 ThrowTerminatingError(new ErrorRecord( ex, "终止错误", ErrorCategory.ConnectionError, ex.Response )); } } } }
下面在控制台上测试:
本文链接: https://www.pstips.net/terminating-errors-and-non-terminating-errors.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
广播: 捕获PowerShell脚本内部的异常 | PowerShell 中文博客