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


about_Trap

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

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

Подробное описание

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

Ключевое 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 инструкция, отображающая ошибку с помощью автоматической переменной $_ :

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 и выполнение продолжается в следующей инструкции после foreach блока, а не внутри foreach блока.trap

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 инструкции внутри удаляются.

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

Вы можете использовать break continue ключевые слова в 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.

См. также