前几天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 中文博客