РАЗДЕЛ 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("http://www.contoso.com/MyDoc.doc") } catch [System.Net.WebException],[System.IO.IOException] { "Не удается загрузить MyDoc.doc с сайта http://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