Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Описывает ключевое слово, которое обрабатывает завершающую ошибку.
Завершающая ошибка останавливает выполнение инструкции. Если 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:
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
После запуска блока элемент управления возвращается к следующему блоку инструкций после расположения ошибки.
Например, если в инструкции возникает завершающаяся ошибка, инструкция выполняется 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!
RuntimeException:
Line |
4 | "`t$(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
ключевые слова в 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 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
PowerShell — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв: