System.Net.WebException 的 Powershell 处理
Posted
技术标签:
【中文标题】System.Net.WebException 的 Powershell 处理【英文标题】:Powershell handling of System.Net.WebException 【发布时间】:2017-07-04 04:47:05 【问题描述】:几乎掌握了 Powershell Invoke-WebRequest 的使用,我现在开始尝试控制异常错误
在这第一段代码中,我必须处理从 Web 服务返回的异常。您可以看到返回 400 代码以及消息描述和详细消息。
Try
$what = Invoke-WebRequest -Uri $GOODURL -Method Post -Body $RequestBody -ContentType $ContentType
catch [System.Net.WebException]
$Request = $_.Exception
Write-host "Exception caught: $Request"
$crap = ($_.Exception.Response.StatusCode.value__ ).ToString().Trim();
Write-Output $crap;
$crapMessage = ($_.Exception.Message).ToString().Trim();
Write-Output $crapMessage;
$crapdescription = ($_.ErrorDetails.Message).ToString().Trim();
Write-Output $crapdescription;
输出返回。不错!
Exception caught: System.Net.WebException: The remote server returned an error: (400) Bad Request.
at Microsoft.PowerShell.Commands.WebRequestPSCmdlet.GetResponse(WebRequest request)
at Microsoft.PowerShell.Commands.WebRequestPSCmdlet.ProcessRecord()
400
The remote server returned an error: (400) Bad Request.
Modus.queueFailed Could not queue message http://schemas.xmlsoap.org/soap/actor/next
这很酷,但是作为测试的一部分,我想模拟连接错误,所以我给脚本提供了一个无效的 URI,然后我在上面代码中的错误处理立即崩溃了。
具体来说,无效的 URI 落在“$_.Exception.Response.StatusCode.value__”和“$_.ErrorDetails.Message”上,大概是因为它们在返回的 System.Net.WebException 对象中不存在
所以,我把它们作为测试拿出来,果然它可以像预期的那样与无效的 URL 一起工作
Try
$what = Invoke-WebRequest -Uri $BADURL -Method Post -Body $RequestBody -ContentType $ContentType
catch [System.Net.WebException]
$Request = $_.Exception
Write-host "Exception caught: $Request"
$crapMessage = ($_.Exception.Message).ToString().Trim();
Write-Output $crapMessage;
我明白了(也不错)
Exception caught: System.Net.WebException: The remote name could not be resolved: 'gateway.zzzzsonicmobile.com'
at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
at Microsoft.PowerShell.Commands.WebRequestPSCmdlet.SetRequestContent(WebRequest request, String content)
at Microsoft.PowerShell.Commands.WebRequestPSCmdlet.ProcessRecord()
at System.Management.Automation.CommandProcessor.ProcessRecord()
The remote name could not be resolved: 'gateway.zzzzsonybile.com'
麻烦的是,第一个示例从异常对象中获取了我想要的所有内容,但不适用于无效的 URL。第二个示例处理无效的 URL(连接错误),但我不知道如何获取 400 StatusCode 和 ErrorDetails.Message
如果可能的话,我真的很想这样做。
有没有办法设置它来处理所有异常处理..?
任何帮助,非常感谢..!
【问题讨论】:
【参考方案1】:我认为您可能只是看到了一个问题,因为您尝试在这些属性不存在时对它们执行 .ToString().Trim()
方法。我不确定执行这些方法是否会增加很多价值,所以我很想删除它们。
或者,您可以在它们周围放置If
块,这样它们只有在它们具有价值时才会被输出:
If ($_.Exception.Response.StatusCode.value__)
$crap = ($_.Exception.Response.StatusCode.value__ ).ToString().Trim();
Write-Output $crap;
If ($_.Exception.Message)
$crapMessage = ($_.Exception.Message).ToString().Trim();
Write-Output $crapMessage;
【讨论】:
你是个天才,伙计!很好发现,我已经使用了“If”块和 ToString(),因为我正在 SQL 服务器中记录结果。非常感谢 :o) 使用 Set-StrictMode -Version 2.0 时,会导致错误消息:“在此对象上找不到属性 'StatusCode'。请验证该属性是否存在。” @BernardVanderBeken 我在“响应”中遇到了这个问题,因为Invoke-Webrequest
在尝试建立连接之前就抛出了一个错误。要解决此问题,请将此解决方案封装在 Set-StrictMode -Off
(或 Set-StrictMode -Version 1.0
)和 Set-StrictMode -Version Latest
之间。但请注意,您不会收到有关 PowerShell API 更改的警报。
@BernardVanderBeken 更好:在 catch 语句中设置错误类型(如问题中所做的那样):catch [System.Net.WebException] ...
以上是关于System.Net.WebException 的 Powershell 处理的主要内容,如果未能解决你的问题,请参考以下文章
System.Net.WebException HTTP 状态码
System.Net.WebException:请求被中止:请求被取消