РАЗДЕЛ
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 {<список_инструкций>}
За ключевым словом Try следует список инструкций в фигурных
скобках. Если во время выполнения инструкций из списка происходит
прерывающая ошибка, скрипт передает объект ошибки из блока Try
соответствующему блоку Catch.
Ниже показан синтаксис блока Catch:
catch [[<тип_ошибки>][',' <тип_ошибки>]*] {<список_инструкций>}
Типы ошибок указываются в квадратных скобках. Внешние скобки
означают, что этот элемент необязателен.
За ключевым словом Catch идет необязательный список
спецификаций типов ошибок и список инструкций. Если в блоке Try
происходит прерывающая ошибка, Windows PowerShell ищет
подходящий блок Catch. Если он найден, выполняются инструкции в
блоке Catch.
Блок Catch может указывать один или несколько типов ошибок. Тип
ошибки - это исключение Microsoft .NET Framework или исключение,
наследуемое от исключения .NET Framework. Блок Catch обрабатывает ошибки
указанного класса исключений .NET Framework или любого класса,
наследуемого от указанного класса.
Если блок Catch указывает тип ошибок, этот блок Catch
обрабатывает этот тип ошибок. Если блок Catch не указывает тип
ошибок, этот блок обрабатывает любые ошибки, возникающие в
блоке Try. Инструкция Try может включать несколько блоков Catch
для разных определенных типов ошибок.
Ниже показан синтаксис блока Finally:
finally {<список_инструкций>}
За ключевым словом Finally следует список инструкций,
выполняющийся при каждом запуске скрипта, даже если инструкция
Try была выполнена без ошибок или ошибка была перехвачена
инструкцией Catch.
Обратите внимание, что при нажатии сочетания клавиш CTRL+C конвейер
останавливается. Объекты, отправляемые в конвейер, не попадут в набор
выходных данных. Поэтому, если должно отображаться какое-нибудь
предложение, например "Выполнен блок Finally", после нажатия
сочетания клавиш CTRL+C его отображение не произойдет, даже если блок
Finally был выполнен.
Перехват ошибок
В приведенном ниже примере скрипта показан блок Try с блоком Catch:
try { NonsenseString }
catch { "Произошла ошибка." }
Ключевое слово Catch должно располагаться непосредственно за
блоком Try или другим блоком Catch.
Windows PowerShell не распознает "NonsenseString" как командлет
или другой элемент. Выполнение скрипта возвращает такие результаты:
Произошла ошибка.
Когда скрипт сталкивается с "NonsenseString", он выдает прерывающую
ошибку. Блок Catch обрабатывает ошибку, выполняя список инструкций в
блоке.
Использование нескольких инструкций Catch
Инструкция Try может содержать любое число блоков Catch. Например,
следующий скрипт содержит блок Try, загружающий файл MyFile.doc. Блок Try
содержит два блока Catch:
try
{
$wc = new-object System.Net.WebClient
$wc.DownloadFile("https://www.contoso.com/MyDoc.doc")
}
catch [System.Net.WebException],[System.IO.IOException]
{
"Не удается загрузить MyDoc.doc с сайта https://www.contoso.com."
}
catch
{
"Произошла неразрешимая ошибка."
}
Первый блок Catch обрабатывает ошибки типов System.Net.WebExcept
ion и System.IO.IOException. Второй блок Catch не указывает тип
ошибок. Второй блок 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_Errors
about_Trap