about_Trap
Краткое описание
Описывает ключевое слово, обрабатывающий неустранимую ошибку.
Подробное описание
Завершающая ошибка останавливает выполнение инструкции. Если PowerShell не обрабатывает устранимую ошибку каким-либо образом, PowerShell также прекращает выполнение функции или скрипта в текущем конвейере. В других языках, таких как C#, устранимые ошибки называются исключениями.
В trap
ключевое слово указывается список инструкций, выполняемых при возникновении неустранимой ошибки. trap
Операторы могут обрабатывать устранимые ошибки следующими способами:
Отображает ошибку после обработки блока инструкций
trap
и продолжения выполнения скрипта или функции, содержащейtrap
. Поведение по умолчанию.Примечание
При возникновении завершающей ошибки в подчиненном блоке скрипта, например
if
в операторе илиforeach
цикле, операторы вtrap
блоке выполняются и выполнение продолжается при следующем операторе за пределами подчиненного блока скрипта.Отображение ошибки и прерывание выполнения скрипта или функции, содержащей
trap
метод usingbreak
, в инструкции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
определенный лексически (самый высокий уровень в блоке скрипта).
В следующем примере выполняется только с trap
whoops 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.