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