Обработка PowerShell System.Net.WebException
Я почти освоил использование Powershell Invoke-WebRequest и теперь пытаюсь получить контроль над ошибками исключений.
В этом первом куске кода я должен обработать исключения, возвращаемые веб-службой. Вы можете увидеть код 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;
}