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


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:
Line |
   3 |      nonsenseString
     |      ~~~~~~~~~~~~~~
     | The term 'nonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.

В следующем примере содержится 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:
Line |
   3 |      nonsenseString
     |      ~~~~~~~~~~~~~~
     | The term 'nonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.

Внимание

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 a name of a
cmdlet, function, script file, or executable program. Check the spelling
of the name, or if a path was included, verify that the path is correct
and try again.

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:
Line |
   5 |      nonsenseString
     |      ~~~~~~~~~~~~~~
     | The term 'nonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.

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

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

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

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

Other terminating error trapped
RuntimeException:
Line |
   5 |  1/$null
     |  ~~~~~~~
     | Attempted to divide by zero.

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

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

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

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

trap { 'An error occurred!'}
foreach ($x in 3..0) {
   1/$x
   'after division'
}
'after loop'
0.333333333333333
after division
0.5
after division
1
after division
An error occurred!
RuntimeException:
Line |
   3 |     1/$x
     |     ~~~~
     | Attempted to divide by zero.
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:
Line |
   3 |      NonsenseString
     |      ~~~~~~~~~~~~~~
     | The term 'NonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.
function1 was completed

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

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

function function2 {
    NonsenseString
    'function2 was completed'
}

trap { 'An error:' }

function2

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

An error:
NonsenseString:
Line |
   2 |      NonsenseString
     |      ~~~~~~~~~~~~~~
     | The term 'NonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.

В этом примере 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
ParentContainsErrorRecordException:
Line |
   6 |      1/$null
     |      ~~~~~~~
     | Attempted to divide by zero.

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

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

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

function continue_example {
    trap {
        'Error trapped'
        continue
    }
    1/$null
    'Function completed.'
}

continue_example
Error trapped
Function completed.

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

Примечания.

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

См. также