PowerShell ловит типизированные исключения

У меня возникла проблема с 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

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

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

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

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

2 ответа

Решение

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

try 
{
    Get-Process -Id 123123 -ErrorAction Stop
} 
catch [System.Management.Automation.ActionPreferenceStopException]
{
    ... do something ...
}

Может быть, потому что вам не хватает действия при ошибке

      try 
{ 
    kill 1234567 -ErrorAction Stop 
} 
catch 
{ 
    Write-Host "Blam!" 
}
Другие вопросы по тегам