PowerShell ловит типизированные исключения - PullRequest
15 голосов
/ 05 декабря 2011

У меня проблема с PowerShell, когда он не будет перехватывать исключение, даже если исключение явно указано в команде catch.

В этом случае я пытаюсь определить, является ли ProcessIDвсе еще работает, и если нет, то он предпримет некоторые действия.

Пример блока кода, с которым я борюсь:

    try {
      Get-Process -Id 123123 -ErrorAction 'Stop'
    } 
    catch [Microsoft.PowerShell.Commands.ProcessCommandException] {
      "Caught by Exception Type: Process is missing"
    }
    catch {
    if ($_.Exception.getType().FullName -eq "Microsoft.PowerShell.Commands.ProcessCommandException") {
      "Caught by Catch All: Process is missing"
      }
    }

Когда этот блок кода выполняется, вывод:

Caught by Catch All: Process is missing

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

Что еще хуже, когда запускается вторая команда перехвата(который что-то ловит) он запрашивает имя типа исключения и проверяет, является ли он «Microsoft.PowerShell.Commands.ProcessCommandException» (что это такое), а затем предпринимает соответствующие шаги.

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

Кто-нибудь может пролить свет на это для меня?

1 Ответ

24 голосов
/ 05 декабря 2011

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

try 
{
    Get-Process -Id 123123 -ErrorAction Stop
} 
catch [System.Management.Automation.ActionPreferenceStopException]
{
    ... do something ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...