Try/Catch/Finally в PowerShell

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

Но так как он всё же очень классный — то чего нет можно дописать😉 Вот к примеру если кому то не хватает привычной конструкции Try/Catch/Finally то Adam Weigert её написал🙂 За что ему большое спасибо🙂 (и ajax76 спасибо что напомнил🙂 )

Достаточно добавить в свой профиль следующую функцию:

function Try
{
    param
    (
        [ScriptBlock]$Command = $(throw "The parameter -Command is required."),
        [ScriptBlock]$Catch   = { throw $_ },
        [ScriptBlock]$Finally = {}
    )
    & {
        $local:ErrorActionPreference = "SilentlyContinue"
        trap
        {
            trap
            {
                & {
                    trap { throw $_ }
                    &$Finally
                }
                throw $_
            }
            $_ | & { &$Catch }
        }
        &$Command
    }
    & {
        trap { throw $_ }
        &$Finally
    }
}

И можно использовать:

Try {
    echo " ::Do some work..."
    echo " ::Try divide by zero: $(0/0)"
} -Catch {
    echo "  ::Cannot handle the error (will rethrow): $_"
    #throw $_
} -Finally {
    echo " ::Cleanup resources..."
}

Опишу несколько неочевидных моментов из скрипта:

В качестве параметров для функции принимаются [ScriptBlock], то есть грубо говоря «куски кода». Передаются они (как в видно в примере) заключенными в фигурные скобки, как и везде в PowerShell: в командлетах — foreach-object {скриптблок}, конструкциях — if () {скриптблок} или ключевых словах — trap {скриптблок}.

Выполнить переменную содержащую скриптблок можно используя оператор Invoke — «&»:

&$Command

Когда выполняется скриптблок указанный для throw, то в пределах этого скриптблока, в переменную $_ помещается объект текущей ошибки.

Ключевое слово Throw используется для вызова ошибки. То есть просто указываем ему в качестве аргумента объект ошибки или какое-нибудь сообщение:

[PS <4> C:\Root] throw "Ошипко"
Ошипко
At line:1 char:6
+ throw <<<<  "Ошипко"
Опубликовано в Learn, PowerShell, Scripting, Tips. Комментарии к записи Try/Catch/Finally в PowerShell отключены
%d такие блоггеры, как: