You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从C#调用PowerShell脚本:错误判断逻辑的合理性问询

问题:PowerShell脚本调用中依赖错误消息文本触发令牌重建是否合理?

我尝试调用一个使用令牌的PowerShell脚本,当前实现的错误处理代码如下:

var results = powerShell.Invoke();
if (powerShell.HadErrors)
{
    foreach (var error in powerShell.Streams.Error)
    {                            
        ErrorLog.LogError("Error in invoking powershell script " + error.ToString());
        if(error.Exception.Message.Contains("The remote server returned an error: (401) Unauthorized."))
        {
            //Recreate the tokens
        }

    }
}

目前会收到上述特定错误消息,但仅通过检查该消息内容来触发令牌重建是否合理?若未来错误消息变更或系统语言不同,该逻辑可能失效。另外我已确认异常类型为WebException类。

回答
  • 直接检查错误消息文本完全不合理,主要有两个致命问题:

    1. 错误消息会随系统语言切换,比如在中文环境下,401对应的提示文本会变成"远程服务器返回错误: (401) 未授权。",此时英文文本匹配直接失效;
    2. 微软可能在后续.NET版本或PowerShell更新中调整错误消息的格式,导致文本匹配逻辑断裂。
  • 正确的做法是基于WebException的HTTP状态码判断,这是HTTP协议的标准定义,完全不受文本变化影响:
    优化后的代码示例:

var results = powerShell.Invoke();
if (powerShell.HadErrors)
{
    foreach (var error in powerShell.Streams.Error)
    {                            
        ErrorLog.LogError("Error in invoking powershell script " + error.ToString());
        // 类型转换WebException
        var webException = error.Exception as WebException;
        if (webException != null)
        {
            // 获取HTTP响应对象
            var httpResponse = webException.Response as HttpWebResponse;
            if (httpResponse != null && httpResponse.StatusCode == HttpStatusCode.Unauthorized)
            {
                // 执行令牌重建逻辑
            }
        }
    }
}
  • 这种方式的优势很明显:
    • 稳定性强:HTTP状态码是协议标准,不会随语言、版本更新轻易变更;
    • 逻辑清晰:直接对应"未授权"的业务场景,代码可读性和维护性更高。

内容的提问来源于stack exchange,提问作者Shad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 04:57:45