Поделиться через


about_Trap

Краткое описание

Описывает ключевое слово, которое обрабатывает завершающие операторы и завершающие сценарии ошибки.

Длинное описание

Завершающая ошибка останавливает выполнение инструкции. PowerShell различает завершающие инструкции ошибки (которые останавливают только текущую инструкцию) от завершающихся сценарием ошибок (которые отменяют весь стек вызовов). Ключевое trap слово может обрабатывать оба вида. Дополнительные сведения о категориях ошибок см. в about_Error_Handling.

Ключевое trap слово указывает список инструкций, выполняемых при возникновении завершающегося ошибки. trap Операторы могут обрабатывать завершающие ошибки следующими способами:

  • Отобразите ошибку после обработки trap блока инструкций и продолжения выполнения скрипта или функции, содержащей объект trap. Поведение по умолчанию.

    Примечание.

    Если в блоке подчиненных инструкций возникает завершающаяся ошибка, например if оператор или foreach цикл, инструкции в trap блоке выполняются, и выполнение продолжается в следующей инструкции за пределами подчиненного блока.

  • Отображение ошибки и прерывания выполнения скрипта или функции, trap содержащей использование break в инструкции trap .

  • Заглушить ошибку, но продолжить выполнение скрипта или функции, содержащей trap ее в continue инструкции trap .

Список инструкций может включать несколько условий trap или вызовов функций. Может trap записывать журналы, условия тестирования или даже запускать другую программу.

Синтаксис

Оператор trap имеет следующий синтаксис:

trap [[<error type>]] {<statement list>}

Инструкция trap содержит список инструкций, выполняемых при возникновении завершающегося ошибки. Оператор trap состоит из ключевого trap слова, необязательно за которым следует выражение типа, и блок инструкций, содержащий список инструкций, выполняемых при ловушке ошибки. Выражение типа обновляет типы ошибок, которые перехватывается trap .

Сценарий или команда могут содержать несколько trap инструкций. trap операторы могут отображаться в любом месте скрипта или команды.

Перехват всех конечных ошибок

Если происходит завершающаяся ошибка, которая не обрабатывается другим способом в скрипте или команде, PowerShell проверяет инструкцию trap , которая обрабатывает ошибку. trap Если инструкция присутствует, PowerShell продолжает выполнять скрипт или команду в инструкцииtrap.

В следующем примере используется минимальная trap инструкция:

trap { 'Error found.' }

Эта trap инструкция перехватывает любую завершающееся ошибку.

В следующем примере функция включает в себя строку, которая вызывает ошибку среды выполнения.

function TrapTest {
    trap { 'Error found.' }
    nonsenseString
}

TrapTest

Выполнение этой функции возвращает следующие выходные данные:

Error found.
nonsenseString : The term 'nonsenseString' is not recognized as the name
of a cmdlet, function, script file, or operable program. Check the
spelling of the name, or if a path was included, verify that the path is
correct and try again.
At line:3 char:5
+     nonsenseString
+     ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (nonsenseString:String) []
   , CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

В следующем примере содержится trap инструкция, отображающая ошибку с помощью или $_ автоматической переменной$PSItem:

function TrapTest {
    trap { "Error found: $_" }
    nonsenseString
}

TrapTest

Выполнение этой версии функции возвращает следующие выходные данные:

Error found: The term 'nonsenseString' is not recognized as the name of a
cmdlet, function, script file, or operable program. Check the spelling of
the name, or if a path was included, verify that the path is correct and
try again.
nonsenseString : The term 'nonsenseString' is not recognized as the name
of a cmdlet, function, script file, or operable program. Check the
spelling of the name, or if a path was included, verify that the path is
correct and try again.
At line:3 char:5
+     nonsenseString
+     ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (nonsenseString:String) []
   , CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Внимание

trap операторы можно определить в любом месте в заданном блоке скрипта, но всегда применяться ко всем операторам в этом скриптблоке. Во время выполнения trap операторы в блоке определяются перед выполнением любых других инструкций. На других языках, таких как JavaScript, это называется подъемом. Это означает, что trap инструкции применяются ко всем операторам в этом блоке, даже если выполнение не продвинулось до точки, в которой они определены. Например, определение trap в конце скрипта и создание ошибки в первой инструкции по-прежнему активирует это trap.

Перехват конкретных ошибок

Сценарий или команда могут содержать несколько trap инструкций. Можно определить для trap обработки определенных ошибок.

В следующем примере показана инструкция, которая перехватывает конкретную trap ошибку CommandNotFoundException:

trap [System.Management.Automation.CommandNotFoundException] {
    'Command error trapped'
}

Если функция или скрипт обнаруживает строку, которая не соответствует известной команде, эта trap инструкция отображает Command error trapped строку. После выполнения списка инструкций trap PowerShell записывает объект ошибки в поток ошибок, а затем продолжает скрипт.

PowerShell использует типы исключений .NET. В следующем примере указывается тип ошибки System.Exception :

trap [System.Exception] { 'An error trapped' }

Тип ошибки CommandNotFoundException наследуется от типа System.Exception . Эта инструкция перехватывает все ошибки, вызванные неизвестными командами. Он также перехватывает другие типы ошибок.

Тип исключения для ошибки можно найти, проверяя объект ошибки. В следующем примере показано, как получить полное имя исключения для последней ошибки в сеансе:

nonsenseString
$Error[0].Exception.GetType().FullName
nonsenseString : The term 'nonsenseString' is not recognized as the name
of a cmdlet, function, script file, or operable program. Check the
spelling of the name, or if a path was included, verify that the path is
correct and try again.
At line:1 char:1
+ nonsenseString
+ ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (nonsenseString:String) []
   , CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

System.Management.Automation.CommandNotFoundException

В скрипте может быть несколько trap инструкций. Только одна trap инструкция может захватить каждый тип ошибки. При возникновении конечной ошибки PowerShell выполняет поиск trap по наиболее конкретному совпадению, начиная с текущего скрипта выполнения.

В следующем примере скрипта содержится ошибка. Скрипт содержит общую trap инструкцию, которая перехватывает любую завершающую ошибку и определенную trap инструкцию, указывающую тип CommandNotFoundException .

trap { 'Other terminating error trapped' }
trap [System.Management.Automation.CommandNotFoundException] {
  'Command error trapped'
}
nonsenseString

Выполнение этого скрипта приводит к следующему результату:

Command error trapped
nonsenseString : The term 'nonsenseString' is not recognized as the name
of a cmdlet, function, script file, or operable program. Check the
spelling of the name, or if a path was included, verify that the path is
correct and try again.
At line:5 char:1
+ nonsenseString}
+ ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (nonsenseString:String) []
   , CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Так как PowerShell не распознает nonsenseString как командлет или другой элемент, он возвращает ошибку CommandNotFoundException. trap Конкретная инструкция перехватывает эту завершаемую ошибку.

В следующем примере скрипта содержатся те же trap инструкции с другой ошибкой:

trap { 'Other terminating error trapped' }
trap [System.Management.Automation.CommandNotFoundException] {
    'Command error trapped'
}
1/$null

Выполнение этого скрипта приводит к следующему результату:

Other terminating error trapped
Attempted to divide by zero.
At line:5 char:1
+ 1/$null}
+ ~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

Попытка деления на ноль не создает ошибку CommandNotFoundException . Другая trap инструкция, которая перехватывает любую завершающую ошибку, перехватывает деление на нулевую ошибку.

Перехват ошибок в блоке скрипта

По умолчанию при возникновении завершающегося ошибки выполнение передается оператору ловушки. trap После запуска блока элемент управления возвращается к следующему блоку инструкций после расположения ошибки.

Например, если в инструкции возникает завершающаяся ошибка, инструкция выполняется foreach и выполнение продолжается в следующей инструкции после trap блока, а не внутри foreach блока.foreach

trap { 'An error occurred!'}
foreach ($x in 3..-1) {
       "1/$x = "
       "`t$(1/$x)"
}
'after loop'
1/3 =
        0.333333333333333
1/2 =
        0.5
1/1 =
        1
1/0 =
An error occurred!
Attempted to divide by zero.
At line:3 char:4
+    1/$x
+    ~~~~
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

after loop

В выходных данных циклы будут продолжаться до последней итерации. Когда скрипт пытается разделить 1 на 0, PowerShell выдает завершающееся сообщение об ошибке. Скрипт пропускает остальную часть foreach инструкции, выполняет try инструкцию и продолжается после инструкции foreach .

Ошибки и область перехвата

Если завершающая ошибка возникает в том же блоке скрипта, что trap и инструкция, PowerShell запускает список инструкций, определенных оператором trap. Выполнение продолжается в инструкции после ошибки. trap Если инструкция находится в другом блоке скрипта от ошибки, выполнение продолжается в следующей инструкции, которая находится в том же блоке скрипта, что и инструкцияtrap.

Например, если ошибка возникает в функции, а trap инструкция находится в функции, скрипт продолжается в следующей инструкции. Следующий скрипт содержит ошибку и инструкцию trap :

function function1 {
    trap { 'An error: ' }
    NonsenseString
    'function1 was completed'
}

function1

Выполнение этого скрипта приводит к следующему результату:

An error:
NonsenseString : The term 'NonsenseString' is not recognized as the name
of a cmdlet, function, script file, or operable program. Check the
spelling of the name, or if a path was included, verify that the path is
correct and try again.
At line:3 char:5
+     NonsenseString
+     ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (NonsenseString:String) []
   , CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

function1 was completed

Оператор trap в функции перехватывает ошибку. После отображения сообщения PowerShell возобновляет выполнение функции. Обратите внимание, что Function1 выполнено после инструкции trap .

Сравните это поведение со следующим примером, который имеет ту же ошибку и trap оператор. В этом примере trap инструкция возникает вне функции:

function function2 {
    NonsenseString
    'function2 was completed'
}

trap { 'An error:' }

function2

Function2 Выполнение функции приводит к следующему результату:

An error:
NonsenseString : The term 'NonsenseString' is not recognized as the name
of a cmdlet, function, script file, or operable program. Check the
spelling of the name, or if a path was included, verify that the path is
correct and try again.
At line:2 char:5
+     NonsenseString
+     ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (NonsenseString:String) []
   , CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

В этом примере function2 was completed команда не выполнялось. В обоих примерах в функции возникает завершающая ошибка. Однако в этом примере trap инструкция находится вне функции. PowerShell не возвращается в функцию после выполнения инструкции trap .

Внимание

При определении нескольких перехватов для одного условия ошибки используется первый trap определенный лексически (самый высокий в скрипте).

В следующем примере выполняется trap только выполнение whoops 1 .

Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { 'whoops 1'; continue }
trap { 'whoops 2'; continue }

Внимание

Оператор trap ограничен тем, где он компилируется. Если у вас есть trap оператор внутри функции или исходного скрипта точки, при выходе функции или исходного скрипта точки все trap инструкции внутри удаляются.

Использование ключевых слов останова и продолжения

Вы можете использовать breakcontinue ключевые слова в trap инструкции, чтобы определить, продолжает ли скрипт или команда выполняться после завершения ошибки.

Если вы включаете break инструкцию в trap список инструкций, PowerShell останавливает функцию или скрипт. Следующая пример функции использует ключевое break слово в инструкции trap :

function break_example {
    trap {
        'Error trapped'
        break
    }
    1/$null
    'Function completed.'
}

break_example
Error trapped
Attempted to divide by zero.
At line:6 char:5
+     1/$null
+     ~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorR
   ecordException
    + FullyQualifiedErrorId : RuntimeException

trap Так как инструкция включала ключевое break слово, функция не продолжает выполняться, и Function completed строка не выполняется.

Если вы включаете continue ключевое слово в trap инструкцию, PowerShell возобновляется после инструкции, вызвавшей ошибку, так же, как и без break него continue. Однако при использовании ключевого continue слова PowerShell не записывает ошибку в поток ошибок.

Следующая пример функции использует ключевое continue слово в инструкции trap :

function ContinueExample {
    trap {
        'Error trapped'
        continue
    }
    foreach ($x in 3..-1) {
       "1/$x = "
       "`t$(1/$x)"
    }
    'End of function'
}

ContinueExample
1/3 =
        0.333333333333333
1/2 =
        0.5
1/1 =
        1
1/0 =
Error trapped
End of function

Функция возобновляется после того, как ошибка находится в ловушке, и End of function инструкция выполняется. Ошибка не записывается в поток ошибок.

Примечания.

trap операторы предоставляют способ обеспечить обработку всех конечных ошибок в скриптблоке. Для более точной обработки ошибок используйте try/catch блоки, в которых ловушки определяются с помощью catch инструкций. Инструкции catch применяются только к коду внутри связанной try инструкции. Дополнительные сведения см. в разделе about_Try_Catch_Finally.

См. также