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


about_Try_Catch_Finally

Краткое описание

Описывает, как использовать tryи catchfinally блоки для обработки завершающих ошибок.

Подробное описание

Используйте 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 похожи на trycatchfinally ключевые слова, используемые на языке программирования 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 останавливает конвейер. Объекты, отправленные в конвейер, не будут отображаться в виде выходных данных. Таким образом, если вы включаете инструкцию, которая будет отображаться, например "Наконец блок запущен", она не будет отображаться после нажатия клавиш CTRL+C, даже если finally блок запущен.

выявления ошибок;

В следующем примере скрипта try показан блок с блоком catch :

try { NonsenseString }
catch { "An error occurred." }

Ключевое catch слово должно немедленно следовать блоку или другому catch блокуtry.

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 ошибку Command Not Found:

catch [System.Management.Automation.CommandNotFoundException]
{"Inherited Exception" }

Указанный тип ошибки CommandNotFoundException наследует от типа System.SystemException. Следующий пример также перехватывает ошибку Command Not Found:

catch [System.SystemException] {"Base Exception" }

Этот catch блок обрабатывает ошибку Command Not Found и другие ошибки, наследуемые от типа SystemException .

Если указать класс ошибок и один из производных классов, поместите catch блок для производного класса перед блоком catch общего класса.

Примечание.

PowerShell упаковывает все исключения в тип RuntimeException . Таким образом, указание типа ошибки System.Management.Automation.RuntimeException ведет себя так же, как и блок неквалифицированного перехвата.

Использование ловушек в пробном перехвате

Если в блоке возникает завершающая ошибка, Trap определяемая в try 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 блок после try и catch блоков. Операторы finally блока выполняются независимо от того, встречается ли try блок с ошибкой конца. PowerShell запускает finally блок до завершения скрипта или до выхода текущего блока из области.

finally Блок запускается, даже если для остановки скрипта используется CTRL+C. Блок finally также запускается, если ключевое слово Exit останавливает скрипт из catch блока.

См. также