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.
См. также
PowerShell