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