Тип исключения ловли Powershell - PullRequest
0 голосов
/ 15 января 2019

Есть ли удобный способ отлавливать типы исключений и внутренние исключения для целей try-catch?

Пример кода:

$a = 5
$b = Read-Host "Enter number" 
$c = $a / $b #error if $b -eq 0
$d = get-content C:\I\Do\Not\Exist

Строка # 3 сгенерирует ошибку времени выполнения с внутренним исключением (EDIT: исправлена ​​эта команда $ Error [1] .Exception.InnerException.GetType ()), строка # 4 сгенерирует «стандартный» (?) Тип исключение ($ Error [0] .Exception.GetType ()).

Можно ли получить желаемый результат от обоих с одинаковой строкой кода?

Ad1: ошибка из строки 3

At -path-:3 char:1

+ $c = $a / $b #error if $b -eq 0
+ ~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

Ad2: ошибка из строки 4

get-content : Cannot find path 'C:\I\Do\Not\Exist' because it does not exist.

At -path-:4 char:6

+ $d = get-content C:\I\Do\Not\Exist

+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : ObjectNotFound: (C:\I\Do\Not\Exist:String) 
[Get-Content], ItemNotFoundException    
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand

Редактировать: чтобы было ясно, я хочу, чтобы результат возвращал DivideByZeroException и ItemNotFoundException в некотором роде

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Прежде всего, вы можете явно отловить определенные типы исключений:

$ErrorActionPreference = "Stop"
try {
    1/0
}
catch [System.DivideByZeroException] {
    $_.Exception.GetType().Name
}
try {
    gi "c:\x"
}
catch [System.Management.Automation.ItemNotFoundException] {
    $_.Exception.GetType().Name
}

DivideByZeroException - это просто InnerException RuntimeException, и теоретически InnerException могут быть бесконечно вложенными:

catch {
    $exception = $_.Exception
    do {
        $exception.GetType().Name
        $exception = $exception.InnerException
    } while ($exception)
}

НО Вы можете обрабатывать RuntimeException как особый случай. Даже PowerShell делает это. Посмотрите на первый пример кода. Блок захвата достигается, даже если указан тип исключения inner .

Вы могли бы сделать что-то подобное самостоятельно:

catch {
    $exception = $_.Exception
    if ($exception -is [System.Management.Automation.RuntimeException] -and $exception.InnerException) {
        $exception = $exception.InnerException
    }
    $exception.GetType().Name
}

ПРИМЕЧАНИЕ , что вам требуется один try-catch для каждой команды, если вы хотите перехватить оба исключения. Иначе 2-й не будет выполнен, если 1-й не пройден. Также вы должны указать от $ErrorActionPreference до "Stop", чтобы перехватывать также не завершающиеся исключения.

0 голосов
/ 15 января 2019

Вы пытаетесь поймать определенные типы ошибок, как это?

https://blogs.technet.microsoft.com/poshchap/2017/02/24/try-to-catch-error-exception-types/

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