Поделиться через


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.

См. также раздел