Powershell не ловит исключение из NewWebServiceProxy

У меня проблема с отловом исключения из командлета NewWebServiceProxy

try {
    $myService = New-WebServiceProxy -Uri "http://localhost/someservice.svc"
}
catch {
    Write-Log ([string]::Format("Error : {0}", $_.Exception.Message))
}

Когда я запускаю его, я получаю это необработанное исключение: New-WebServiceProxy:

Запрос не выполнен с состоянием HTTP 404: не найдено. В C: \ Users \ SomeUser \ AppData \ Local \ Temp \ d052b604-38ad-4827-b952-4ebc66e79c69.ps1: 2 char: 18 + $ myService = New-WebServiceProxy -Uri "http://localhost/someservice.svc" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~ + CategoryInfo: ObjectNotFound: (http://localhost/someservice.svc:Uri) [New-WebServiceProxy], WebExc eption + FullyQualifiedErrorId: WebException, Microsoft.PowerShell.Commands.NewWebServiceProxy

Кто-нибудь может спросить меня, почему попробуйте catch не поймать это исключение? Спасибо за любой ответ

2 ответа

Это одна из наиболее распространенных проблем при обнаружении необработанного исключения в powershell. Вам нужно использовать -ErrorAction Stop в команде New-WebServiceProxy

try {
    $myService = New-WebServiceProxy -Uri "http://localhost/someservice.svc" -ErrorAction Stop
}
catch [System.Net.WebException]{
    Write-Log ([string]::Format("Error : {0}", $_.Exception.Message))
}

Обновлено: для ловли Http исключения включают [System.Net.WebException] как отметил Кит Хилл в комментарии ниже.

Что мне помогло, так это сделать что-то вроде

      try{
    New-WebServiceProxy -URI $webURL -ErrorAction Stop
}
catch [System.Net.WebException] {
        return [PSCustomObject]@{
            SOAPStatus = 'Failed'
            SOAPException = $_.Exception.Message
            SOAPInnerException = $_.Exception.InnerException.Message
        } 
    }
    catch {
        return [PSCustomObject]@{
            SOAPStatus = 'Failed'
            SOAPError = $_.Exception.Message
        } 
    }

Перехватив внутреннее исключение, я обнаружил, что также получу веб-ответ, если с ним возникнет проблема. Что обычно в этих случаях было что-то вроде этого для вывода:

SOAPStatus: Failed SOAPException: произошла ошибка при загрузке «http://webserviceurl.com:1010/SystemServiceQuery».

SOAPInnerException : запрос не выполнен со статусом HTTP 401: неавторизованный.

Конечно, вы могли бы затем зафиксировать тип внутреннего исключения и дать более полезную обратную связь своим пользователям и тому подобное.

Другие вопросы по тегам