捕获终止与非终止错误

再谈PowerShell终止与非终止错误 1


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

关于 Mooser Lee

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

发表评论

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

一条评论 “再谈PowerShell终止与非终止错误