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


about_Trap

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

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

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

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

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

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

    Примечание

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

  • Отображение ошибки и прерывание выполнения скрипта или функции, содержащей trap метод using 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. trap После выполнения блока управление возвращается к следующему блоку инструкции после расположения ошибки.

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

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 определенный лексически (самый высокий уровень в блоке скрипта).

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

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

Важно!

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

Использование ключевых слов break и continue

Ключевые 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.

См. также раздел