Поиск по сайту:

Овладение обработкой ошибок в PowerShell: Try, Catch и Finally


Обработка ошибок является критически важным аспектом написания надежных скриптов на любом языке программирования. PowerShell предлагает мощную структуру для элегантной обработки ошибок с использованием блоков try, catch и finally. Эти конструкции позволяют нам управлять исключениями и обеспечивать выполнение важных действий по очистке, даже когда возникают ошибки. В этом блоге я покажу вам, как использовать try, catch и finally в PowerShell. Давайте начнем.

Понимание Try, Catch и Finally

Блок try содержит код, который может вызвать ошибку. Если возникает ошибка, выполняется блок catch, что позволяет вам обработать ошибку. Блок finally является необязательным и содержит код, который выполняется независимо от того, произошла ошибка или нет.

Давайте посмотрим на синтаксис.

try {
    # Code that might throw an exception
} catch {
    # Code to handle the error
} finally {
    # Code that runs regardless of whether an error occurred
}

Вот еще два примера, на которых вы можете основываться.

Try {
    1/0
}
Catch {
    $_.Exception # Error Message
 }

В этом примере сообщение об ошибке будет отображаться, если произойдет ошибка. Вы можете знать переменную $_ как переменную конвейера.

И вот еще один пример, который более практичен и представляет собой реальный сценарий.

$ErrorActionPreference="Stop"
Try {
    Get-ChildItem -Path C:\notthere
}
Catch {
    Write-Warning "Folder not present."
}

Теперь вы можете спросить, почему я использовал переменную $ErrorActionPreference. Попробуйте без изменения обработки ошибок! Я не буду работать!

В этом примере установка ErrorActionPreference в Stop гарантирует, что некритическая ошибка команды Get-ChildItem будет поймана блоком catch, позволяя выполнить соответствующую обработку ошибок. Ошибка не будет критической; на самом деле это некритическая ошибка, из-за чего PowerShell игнорирует блок Catch.

С блоками try-catch вы всегда должны помнить, что ошибка может быть некритической, которая игнорирует вашу функцию catch.