从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类。
回答
直接检查错误消息文本完全不合理,主要有两个致命问题:
- 错误消息会随系统语言切换,比如在中文环境下,401对应的提示文本会变成
"远程服务器返回错误: (401) 未授权。",此时英文文本匹配直接失效; - 微软可能在后续.NET版本或PowerShell更新中调整错误消息的格式,导致文本匹配逻辑断裂。
- 错误消息会随系统语言切换,比如在中文环境下,401对应的提示文本会变成
正确的做法是基于
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
相关产品推荐
相关产品推荐

