Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Назначение: Windows PowerShell 2.0, Windows PowerShell 3.0
РАЗДЕЛ
about_Trap
КРАТКОЕ ОПИСАНИЕ
Содержит описание ключевого слова, которое служит для обработки неустранимой ошибки.
ПОДРОБНОЕ ОПИСАНИЕ
Неустранимая ошибка останавливает выполнение оператора. Если Windows PowerShell® не обрабатывает неустранимую ошибку каким-либо образом, Windows PowerShell также прекращает выполнение функции или сценария в текущем конвейере. В других языках, таких как C#, неустранимые ошибки называются исключениями.
Ключевое слово Trap определяет список операторов, которые нужно выполнить при возникновении неустранимой ошибки. Операторы Trap обрабатывают неустранимые ошибки и обеспечивают дальнейшее выполнение сценария или функции.
СИНТАКСИС
Оператор Trap имеет следующий синтаксис:
trap [[<error type>]] {<statement list>}
Оператор Trap включает список операторов, которые нужно выполнить при возникновении неустранимой ошибки. Кроме того, ключевое слово Trap может задавать тип ошибки. Тип ошибки указывается в квадратных скобках.
Сценарий или команда могут содержать несколько операторов Trap. Операторы Trap можно помещать в любое место сценария или команды.
ПЕРЕХВАТ ВСЕХ НЕУСТРАНИМЫХ ОШИБОК
При возникновении неустранимой ошибки, которая не обрабатывается сценарием или командой, Windows PowerShell проверяет, нет ли оператора Trap для обработки этой ошибки. Если оператор Trap есть, Windows PowerShell продолжает выполнять сценарий или команду в операторе Trap.
Ниже показан пример простейшего оператора Trap.
trap {"Error found."}
Этот оператор Trap перехватывает все неустранимые ошибки. Ниже показан пример функции, содержащей этот оператор Trap.
function TrapTest {
trap {"Error found."}
nonsenseString
}
Эта функция включает бессмысленную строку, вызывающую ошибку. При выполнении эта функция возвращает следующие результаты:
C:\PS> TrapTest
Error found.
Ниже показан пример оператора Trap, выводящего ошибку с помощью автоматической переменной $_.
function TrapTest {
trap {"Error found: $_"}
nonsenseString
}
При выполнении эта версия функции возвращает следующие результаты:
C:\PS> 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 then try again.
Операторы Trap могут быть и сложнее. Они могут включать несколько условий или вызовов функций. Они могут записывать данные в журнал, тестировать или даже запускать другую программу.
ПЕРЕХВАТ ОПРЕДЕЛЕННЫХ НЕУСТРАНИМЫХ ОШИБОК
Ниже показан пример оператора Trap, перехватывающего ошибки типа CommandNotFoundException.
trap [System.Management.Automation.CommandNotFoundException]
{"Command error trapped"}
Когда функция или сценарий обнаруживает строку, не совпадающую с какой-нибудь известной командой, этот оператор Trap отображает строку «Перехвачена ошибка команды». После выполнения операторов списка Trap Windows PowerShell записывает объект ошибки в поток ошибок и продолжает выполнять сценарий.
В Windows PowerShell используются типы исключений Microsoft .NET Framework. В показанном ниже примере задается тип ошибок System.Exception.
trap [System.Exception] {"An error trapped"}
Тип ошибок CommandNotFoundException наследуется от типа System.Exception. Этот оператор перехватывает ошибку, которую создает неизвестная команда. Он также перехватывает другие типы ошибок.
В сценарии может быть несколько операторов Trap. Одна ошибка может быть перехвачена только одним оператором Trap. Если происходит ошибка и при этом доступно несколько операторов Trap, Windows PowerShell использует тот оператор Trap, тип ошибок которого лучше всего соответствует ошибке.
В примере сценария ниже содержится ошибка. Сценарий включает общий оператор Trap, перехватывающий любые неустранимые ошибки, и определенный оператор Trap, для которого задан тип CommandNotFoundException.
trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException] {"Command error trapped"}
nonsenseString
Выполнение сценария приводит к таким результатам:
Command error trapped
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 then try again.
At C:\PS>testScript1.ps1:3 char:19
+ nonsenseString <<<<
Так как Windows 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 C:PS> errorX.ps1:3 char:7
+ 1/ <<<< $null
Попытка поделить на ноль не создает ошибку CommandNotFoundException. Эта ошибка перехватывается другим оператором Trap, предназначенным для любых неустранимых ошибок.
ПЕРЕХВАТ ОШИБОК И ОБЛАСТЬ
Если неустранимая ошибка происходит в той же области, где находится оператор Trap, после выполнения операторов Trap Windows PowerShell продолжает работу с оператора после ошибки. Если ошибка и оператор Trap находятся в разных областях, выполнение продолжается со следующего оператора из области, в которой находится оператор Trap.
Например, если ошибка происходит в функции, а оператор Trap находится в этой функции, сценарий продолжается со следующего оператора. Например, следующий сценарий содержит ошибку и оператор Trap:
function function1 {
trap { "An error: " }
NonsenseString
"function1 was completed"
}
Выполнение функции Function1 в следующей части сценария приводит к таким результатам:
function1
An error:
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
then try again.
At C:\PS>TestScript1.ps1:3 char:19
+ NonsenseString <<<<
function1 was completed
Оператор Trap в функции перехватывает ошибку. После вывода сообщения Windows PowerShell продолжает выполнять функцию. Обратите внимание, что функция Function1 была выполнена.
Сравните это со следующим примером, в котором содержатся те же ошибка и оператор Trap. В этом примере оператор Trap выполняется вне функции:
function function2 {
NonsenseString
"function2 was completed"
}
trap { "An error: " }
. . .
function2
Выполнение функции Function2 в следующей части сценария приводит к таким результатам:
An error:
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
then try again.
At C:\PS>TestScript2.ps1:4 char:19
+ NonsenseString <<<<
В этом примере не была выполнена команда «function2 завершена». Несмотря на то, что обе неустранимые ошибки произошли внутри функции, Windows PowerShell не возвращается в функцию после выполнения оператора Trap, если он находился вне функции.
ИСПОЛЬЗОВАНИЕ КЛЮЧЕВЫХ СЛОВ BREAK И CONTINUE
Ключевые слова Break и Continue можно использовать в операторе Trap, чтобы определить, будет ли сценарий или команда продолжать выполняться после неустранимой ошибки.
Если в список операторов Trap включен оператор Break, Windows PowerShell прерывает функцию или сценарий. В примере функции ниже в операторе Trap используется ключевое слово Break.
C:\PS> function break_example {
trap {"Error trapped"; break;}
1/$null
"Function completed."
}
C:\PS> break_example
Error trapped
Attempted to divide by zero.
At line:4 char:7
Оператор Trap включал ключевое слово Break, поэтому функция перестала выполняться и строка «Функция выполнена» запущена не была.
Если в оператор Trap включен оператор Continue, Windows PowerShell продолжает работу после оператора, вызвавшего ошибку, как если бы ключевого слова Break или Continue не было. Но с ключевым словом Continue Windows PowerShell не записывает ошибку в поток ошибок.
В примере функции ниже в операторе Trap используется ключевое слово Continue.
C:\PS> function continue_example {
trap {"Error trapped"; continue;}
1/$null
"Function completed."}
C:\PS> continue_example
Error trapped
Function completed.
Функция продолжает выполнение после перехвата ошибки, и запускается оператор «Функция выполнена». Ошибка не записывается в поток.
СМ. ТАКЖЕ
about_Break
about_Continue
about_Scopes
about_Throw
about_Try_Catch_Finally