Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Назначение: Windows PowerShell 2.0, Windows PowerShell 3.0
РАЗДЕЛ
about_Try_Catch_Finally
КРАТКОЕ ОПИСАНИЕ
Содержит описание использования блоков Try, Catch и Finally для обработки неустранимых ошибок.
ПОДРОБНОЕ ОПИСАНИЕ
Блоки Try, Catch и Finally используются для ответа или обработки неустранимых ошибок в сценариях. Для обработки неустранимых ошибок в сценариях можно использовать также оператор Trap. Подробнее см. в разделе about_Trap.
Неустранимая ошибка останавливает выполнение оператора. Если Windows PowerShell® не обрабатывает неустранимую ошибку каким-либо образом, Windows PowerShell также прекращает выполнение функции или сценария в текущем конвейере. В других языках, таких как C#, неустранимые ошибки называются исключениями. Подробнее об ошибках см. в разделе about_Errors.
С помощью блока Try определяется раздел сценария, в котором Windows PowerShell следует следить за ошибками. Если в блоке Try происходит ошибка, она сначала сохраняется в автоматическую переменную $Error. Затем Windows PowerShell ищет блок Catch для обработки ошибки. Если у оператора Try нет соответствующего блока Catch, Windows 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 происходит неустранимая ошибка, Windows PowerShell ищет подходящий блок Catch. Если он найден, выполняются операторы в блоке Catch.
Блок Catch может указывать один или несколько типов ошибок. Тип ошибки — это исключение Microsoft .NET Framework или исключение, наследуемое от исключения .NET Framework. Блок Catch обрабатывает ошибки указанного класса исключений .NET Framework или любого класса, наследуемого от указанного класса.
Если блок Catch указывает тип ошибок, он обрабатывает этот тип ошибок. Если блок Catch не указывает тип ошибок, он обрабатывает любые ошибки, возникающие в блоке Try. Оператор Try может включать несколько блоков Catch для разных типов ошибок.
Ниже показан синтаксис блока Finally.
finally {<statement list>}
За ключевым словом Finally следует список операторов, выполняющийся при каждом запуске сценария, даже если оператор Try был выполнен без ошибок или ошибка была перехвачена оператором Catch.
Обратите внимание, что при нажатии клавиш CTRL+C конвейер останавливается. Объекты, отправляемые в конвейер, не попадут в набор выходных данных. Поэтому, если должно отображаться какое-нибудь предложение, например «Выполнен блок Finally», после нажатия клавиш CTRL+C оно не отобразится, даже если блок Finally был выполнен.
ПЕРЕХВАТ ОШИБОК
В приведенном ниже примере сценария показан блок Try с блоком Catch.
try { NonsenseString }
catch { "An error occurred." }
Ключевое слово Catch должно располагаться непосредственно за блоком Try или другим блоком Catch.
Windows PowerShell не распознает «NonsenseString» как командлет или другой элемент. Выполнение сценария приводит к таким результатам:
An error occurred.
Когда сценарий обнаруживает «NonsenseString», он выдает неустранимую ошибку. Блок Catch обрабатывает ошибку, выполняя список операторов в блоке.
ИСПОЛЬЗОВАНИЕ НЕСКОЛЬКИХ ОПЕРАТОРОВ CATCH
Оператор Try может содержать любое число блоков Catch. Например, приведенный ниже сценарий содержит блок Try, скачивающий файл MyFile.doc и содержащий два блока Catch.
try
{
$wc = new-object System.Net.WebClient
$wc.DownloadFile("https://www.contoso.com/MyDoc.doc")
}
catch [System.Net.WebException],[System.IO.IOException]
{
"Unable to download MyDoc.doc from https://www.contoso.com."
}
catch
{
"An error occurred that could not be resolved."
}
Первый блок Catch обрабатывает ошибки типов System.Net.WebException и System.IO.IOException. Второй блок Catch не указывает тип ошибок. Он обрабатывает любые другие возникающие неустранимые ошибки.
Windows PowerShell сопоставляет типы ошибок по наследованию. Блок Catch обрабатывает ошибки указанного класса исключений .NET Framework или любого класса, наследуемого от указанного класса. В примере ниже содержится блок Catch, перехватывающий ошибку «Команда не найдена».
catch [System.Management.Automation.CommandNotFoundException]
{"Inherited Exception" }
Указанный тип ошибок CommandNotFoundException наследуется от типа System.SystemException. Фрагмент в приведенном ниже примере также перехватывает ошибку «Команда не найдена».
catch [System.SystemException] {"Base Exception" }
Этот блок Catch обрабатывает ошибку «Команда не найдена» и другие ошибки, наследуемые от типа SystemException.
Если указывается класс ошибок и один из производных классов, блок Catch для производного класса следует расположить перед блоком Catch для общего класса.
ОСВОБОЖДЕНИЕ РЕСУРСОВ С ПОМОЩЬЮ FINALLY
Чтобы высвободить ресурсы, используемые сценарием, добавьте после блоков Try и Catch блок Finally. Операторы блока Finally выполняются независимо от того, происходит ли в блоке Try неустранимая ошибка. Windows PowerShell выполняет блок Finally перед завершением сценария или перед тем, как текущий блок выйдет из области действия.
Блок Finally выполняется даже при нажатии клавиш CTRL+C для прекращения сценария. Блок Finally также выполняется, если ключевое слово Exit останавливает сценарий из блока Catch.
СМ. ТАКЖЕ
about_Break
about_Continue
about_Scopes
about_Throw
about_Trap