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!"
}