PowerShell:
Обработка ошибок

Как это сделать:

# Базовый Try-Catch для обработки исключений
try {
    # Код, который может вызвать ошибку
    $result = 1 / 0
} catch {
    # Что делать, если произошла ошибка
    Write-Host "Ой, произошла ошибка: $_"
}

# Вывод специального сообщения об ошибке
try {
    Get-Item "nonexistentfile.txt" -ErrorAction Stop
} catch {
    Write-Host "Файл не найден."
}

# Использование переменной $Error для проверки последней ошибки

Подробное погружение

PowerShell прошел долгий путь с момента своего создания как Monad. Обработка ошибок стала более надежной со временем, предлагая функции, похожие на функции других языков программирования. Синтаксис try-catch-finally - это одна из таких кросс-заимствований из языков, подобных C#. До его появления скрипт-программисты в значительной мере полагались на проверку условий и использование автоматической переменной $Error.

В PowerShell также существуют два основных типа ошибок: завершающие и не завершающие. Завершающие ошибки остановят скрипт, если только они не пойманы в блоке try-catch, в то время как не завершающие не остановят, если только вы не укажете -ErrorAction Stop. Это различие критично, поскольку оно предоставляет тонкий контроль над обработкой ошибок, позволяя решать, стоит ли ошибка действительно остановки всего скрипта или ее можно просто зарегистрировать и игнорировать.

Обработка ошибок в PowerShell позволяет использовать блок finally, который выполняется в любом случае - независимо от того, произошла ошибка или нет. Это отлично подходит для задач очистки.

Когда вы глубоко погружены в написание скриптов, вы также можете обрабатывать конкретные типы исключений, что дает вам еще более тонкий контроль.

В качестве альтернативы, есть старый добрый параметр -ErrorVariable для захвата ошибок без генерации исключения. И переменная $? говорит вам, была ли последняя операция успешной. Это удобные инструменты, хотя и немного менее чистые, чем надежный try-catch.

См. также