Поймать последнее внутреннее исключение при использовании флага -ErrorAction Stop - PullRequest
0 голосов
/ 30 мая 2018

Вот код:

Try{
    $connection = Test-Connection -BufferSize 32 -Count 1 -ErrorAction Stop -ComputerName "test"
    return $connection.StatusCode.ToString()
}
Catch [System.Net.NetworkInformation.PingException]{
    return "Ping Exception"
}
Catch [Exception]{
    return "Unexpected exception"
}

Теперь давайте рассмотрим случай, когда -ComputerName не будет найден, это вернет мне System.Net.NetworkInformation.PingException.Но в приведенном выше коде результат будет Unexpected exception.

. Ссылаясь на этот ответ, я должен использовать System.Management.Automation.ActionPreferenceStopException, чтобы поймать его.

Теперь мой вопрос: как мне перехватить последнее внутреннее исключение при использовании флага -ErrorAction Stop.Должен ли я просто бросить PingException?Это не очень хорошая идея, так как я не могу быть уверен, что PinException действительно является причиной триггера ErrorAction.

1 Ответ

0 голосов
/ 30 мая 2018

Оказывается, что при использовании флага -ErrorAction Stop, не прекращающиеся ошибки переносятся и генерируются как тип System.Management.Automation.ActionPreferenceStopException.Поэтому решение было бы пройти через дерево исключений , например,

Try{
    $connection = Test-Connection -BufferSize 32 -Count 1 -ErrorAction Stop -ComputerName "test"
    return $connection.StatusCode.ToString()
}
Catch [System.Management.Automation.ActionPreferenceStopException]{
    $exception = $_.Exception
    #Walk through Exception tree
    while ($exception.InnerException) {
      $exception  = $exception.InnerException
    }
    #Return only the last inner exception
    return $exception.Message
}
Catch [Exception]{
    return "Unexpected exception"
}

РЕДАКТИРОВАТЬ

Обратите внимание, что мой код возвращает последнийвнутреннее исключение Сообщение в виде строки.Та же логика может быть использована для поиска другой информации, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...