Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Краткое описание
Описывает ключевое слово, которое обрабатывает завершающую ошибку.
Длинное описание
Завершающая ошибка останавливает выполнение инструкции. Если 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 инструкция, отображающая ошибку с помощью или $PSItem автоматической переменной$_:
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, это называется [подъем][06]. Это означает, что 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 и выполнение продолжается в следующей инструкции после trap блока, а не внутри foreach блока.foreach
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 инструкции внутри удаляются.
Использование ключевых слов останова и продолжения
Вы можете использовать breakcontinue ключевые слова в 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][05].
См. также
PowerShell