about_Try_Catch_Finally
Краткое описание
Описывает, как использовать блоки try
, catch
и finally
для обработки неустранимых ошибок.
Подробное описание
Используйте try
блоки , catch
и finally
для реагирования на неустранимые ошибки в скриптах или обработки их. Оператор Trap
также можно использовать для обработки устранимых ошибок в скриптах. Дополнительные сведения см. в разделе about_Trap.
Завершающая ошибка останавливает выполнение инструкции. Если PowerShell не обрабатывает устранимую ошибку каким-либо образом, PowerShell также прекращает выполнение функции или скрипта с помощью текущего конвейера. В других языках, таких как C#, устранимые ошибки называются исключениями.
try
Используйте блок , чтобы определить раздел скрипта, в котором PowerShell будет отслеживать ошибки. При возникновении ошибки в блоке try
она сначала сохраняется в автоматической переменной $Error
. Затем PowerShell ищет блок для catch
обработки ошибки. try
Если у оператора нет соответствующего catch
блока, PowerShell продолжает поиск соответствующего catch
блока или Trap
оператора в родительских областях. catch
После завершения блока или если соответствующий catch
блок или Trap
инструкция не найдены, finally
блок запускается. Если ошибка не может быть обработана, она записывается в поток ошибок.
Блок catch
может включать команды для отслеживания ошибки или для восстановления ожидаемого потока скрипта. Блок catch
может указать, какие типы ошибок он перехватывает. Инструкция try
может включать несколько catch
блоков для различных типов ошибок.
Блок finally
можно использовать для освобождения всех ресурсов, которые больше не нужны вашему скрипту.
try
, catch
и finally
напоминают ключевые try
слова , catch
и finally
, используемые в языке программирования C#.
Синтаксис
Оператор try
содержит try
блок, ноль или несколько catch
блоков, а также ноль или один finally
блок. Оператор try
должен иметь по крайней мере один catch
блок или один finally
блок.
Ниже показан try
синтаксис блока:
try {<statement list>}
За try
ключевое слово следует список операторов в фигурных скобках. Если во время выполнения инструкций в списке инструкций возникает завершающая ошибка, скрипт передает объект ошибки из try
блока в соответствующий catch
блок.
Ниже показан catch
синтаксис блока:
catch [[<error type>][',' <error type>]*] {<statement list>}
Типы ошибок отображаются в квадратных скобках. Крайние квадратные скобки указывают, что элемент является необязательным.
За catch
ключевое слово следует необязательный список спецификаций типов ошибок и список инструкций. Если в try
блоке возникает неустранимая ошибка, PowerShell ищет соответствующий catch
блок. Если он найден, выполняются инструкции catch
в блоке.
Блок catch
может указывать один или несколько типов ошибок. Тип ошибки — это исключение Microsoft платформа .NET Framework или исключение, которое является производным от исключения платформа .NET Framework. Блок catch
обрабатывает ошибки указанного платформа .NET Framework класса исключений или любого класса, производного от указанного класса.
catch
Если блок указывает тип ошибки, этот catch
блок обрабатывает этот тип ошибки. catch
Если блок не указывает тип ошибки, он catch
обрабатывает все ошибки, возникшие в блокеtry
. Инструкция try
может включать несколько catch
блоков для различных указанных типов ошибок.
Ниже показан finally
синтаксис блока:
finally {<statement list>}
За finally
ключевое слово следует список инструкций, который выполняется каждый раз при выполнении скрипта, даже если try
инструкция выполнялась без ошибок или в инструкции была обнаружена catch
ошибка.
Обратите внимание, что нажатие клавиш CTRL+C останавливает конвейер. Объекты, отправляемые в конвейер, не будут отображаться в качестве выходных данных. Таким образом, если включить отображаемую инструкцию, например "Finally block has run", она не будет отображаться после нажатия клавиш CTRL+C, даже если finally
блок запущен.
выявления ошибок;
В следующем примере скрипта try
показан блок с блоком catch
:
try { NonsenseString }
catch { "An error occurred." }
Ключевое слово catch
должны сразу следовать за блоком try
или другим блокомcatch
.
PowerShell не распознает "NonsenseString" как командлет или другой элемент. Выполнение этого скрипта возвращает следующий результат:
An error occurred.
Если скрипт обнаруживает "NonsenseString", это приводит к завершающей ошибке. Блок catch
обрабатывает ошибку, выполняя список инструкций внутри блока.
Использование нескольких операторов catch
Оператор try
может иметь любое количество catch
блоков. Например, следующий скрипт содержит try
блок, который скачивает MyDoc.doc
, и содержит два catch
блока:
try {
$wc = new-object System.Net.WebClient
$wc.DownloadFile("http://www.contoso.com/MyDoc.doc","c:\temp\MyDoc.doc")
}
catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from http://www.contoso.com."
}
catch {
"An error occurred that could not be resolved."
}
Первый catch
блок обрабатывает ошибки типов System.Net.WebException и System.IO.IOException . Во втором catch
блоке не указан тип ошибки. Второй catch
блок обрабатывает любые другие устранимые ошибки.
PowerShell сопоставляет типы ошибок по наследованию. Блок catch
обрабатывает ошибки указанного платформа .NET Framework класса исключений или любого класса, производного от указанного класса. Следующий пример содержит catch
блок, который перехватывает ошибку "Команда не найдена".
catch [System.Management.Automation.CommandNotFoundException]
{"Inherited Exception" }
Указанный тип ошибки CommandNotFoundException наследуется от типа System.SystemException . В следующем примере также перехватывается ошибка Command Not Found:
catch [System.SystemException] {"Base Exception" }
Этот catch
блок обрабатывает ошибку "Команда не найдена" и другие ошибки, наследуемые от типа SystemException .
Если указан класс ошибки и один из его производных классов, поместите catch
блок для производного класса перед блоком catch
для общего класса.
Примечание
PowerShell заключает все исключения в тип RuntimeException . Таким образом, указание типа ошибки System.Management.Automation.RuntimeException ведет себя так же, как неквалифицированный блок catch.
Использование ловушек в try catch
При возникновении завершающей ошибки в try
блоке с Trap
определенным в try
блоке , даже если имеется соответствующий catch
блок, Trap
оператор берет на себя управление.
Trap
Если объект существует в блоке выше , чем try
, и в текущем область нет соответствующего catch
блока, Trap
объект будет управлять, даже если любой родительский область имеет соответствующий catch
блок.
Доступ к сведениям об исключении
catch
В блоке доступ к текущей ошибке можно получить с помощью $_
, который также называется $PSItem
. Объект имеет тип ErrorRecord.
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_
}
Выполнение этого скрипта возвращает следующий результат:
An Error occurred:
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.
Доступны дополнительные свойства, например ScriptStackTrace, Exception и ErrorDetails. Например, если изменить скрипт на следующее:
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_.ScriptStackTrace
}
Результат будет выглядеть примерно так:
An Error occurred:
at <ScriptBlock>, <No file>: line 2
Освобождение ресурсов с помощью finally
Чтобы освободить ресурсы, используемые скриптом, добавьте finally
блок после try
блоков и catch
. Инструкции finally
block выполняются независимо от того, возникает ли try
в блоке неустранимая ошибка. PowerShell запускает finally
блок до завершения скрипта или до выхода текущего блока из область.
Блок finally
выполняется, даже если для остановки скрипта используется клавиша CTRL+C . Блок finally
также запускается, если ключевое слово exit останавливает скрипт в блокеcatch
.