Обработка 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;
}
Другие вопросы по тегам