about_Try_Catch_Finally

РАЗДЕЛ
    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