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 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.
В следующем примере приведен оператор 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 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.
Важно!
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 . Эта инструкция перехватывает ошибку, созданную неизвестной командой. Он также перехватывает другие типы ошибок.
В скрипте может быть несколько 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 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.
Так как 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 |
4 | 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: untitled:Untitled-1:3:4
Line |
3 | 1/$x
| ~~~~
| Attempted to divide by zero.
after loop
В выходных данных выше вы увидите, что циклы продолжаются до последней итерации.
Когда скрипт пытается разделить 1 на 0, возникает неустранимая ошибка. Остальная часть foreach
scriptblock пропускается, try
инструкция выполняется и скрипт продолжается после foreach
scriptblock.
Перехват ошибок и область
Если в той же область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 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.
function1 was completed
Оператор trap
в функции перехватывает ошибку. После отображения сообщения PowerShell возобновляет выполнение функции. Обратите внимание, что Function1
выполнено.
Сравните это со следующим примером, в котором имеются те же ошибки и 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 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.
В этом примере команда "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
ключевое слово, функция не продолжает выполняться, а строка "Функция завершена" не выполняется.
При включении 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.
Функция возобновляется после перехвата ошибки и выполнения инструкции "Функция завершена". Ошибка не записывается в поток ошибок.
Примечания
trap
Инструкции предоставляют простой способ обеспечить обработку всех устранимых ошибок в область. Для более точной обработки ошибок используйте try
/catch
блоки, в которых ловушки определяются с помощью catch
инструкций . Операторы catch
применяются только к коду в связанной try
инструкции. Дополнительные сведения см. в разделе about_Try_Catch_Finally.