РАЗДЕЛ
    about_Trap

КРАТКОЕ ОПИСАНИЕ
    Описывает ключевое слово, обрабатывающее прерывающие ошибки.


ПОЛНОЕ ОПИСАНИЕ
    Прерывающая ошибка останавливает выполнение инструкции. Если 
    Windows PowerShell не обрабатывает каким-либо образом прерывающую 
    ошибку, Windows PowerShell прерывает и функцию или скрипт в 
    текущем конвейере. В других языках, например C#, прерывающие 
    ошибки называются исключениями.


    Ключевое слово Trap определяет список инструкций, которые нужно 
    выполнить при возникновении прерывающей ошибки. Инструкции Trap 
    обрабатывают прерывающие ошибки и обеспечивают продолжение 
    выполнения скрипта или функции.


  Синтаксис

      Синтаксис инструкции Trap следующий:

          trap [[<тип_ошибки>]] {<список_инструкций>}


      Инструкция Trap включает список инструкций, которые нужно 
      выполнить при возникновении прерывающей ошибки. Ключевое слово 
      Trap может, кроме того, задавать тип ошибки. Тип ошибки 
      указывается в квадратных скобках. 


      Скрипт или команда могут содержать несколько инструкций Trap. 
      Инструкции Trap можно помещать в любое место скрипта или команды. 


  Перехват всех прерывающих ошибок

      При возникновении прерывающей ошибки, которая не обрабатывается 
      скриптом или командой, Windows PowerShell проверяет, нет ли 
      инструкции Trap для обработки этой ошибки. Если инструкция Trap 
      есть, Windows PowerShell продолжает выполнять скрипт или 
      команду в инструкции Trap.
 

      Ниже показан пример простейшей инструкции Trap:

          trap {"Обнаружена ошибка."}


      Эта инструкция Trap перехватывает все прерывающие ошибки. Ниже 
      показан пример функции, содержащей эту инструкцию Trap:

          function TrapTest {
              trap {"Обнаружена ошибка."}
              nonsenseString
              }


      Эта функция включает бессмысленную строку, вызывающую ошибку. 
      При выполнении эта функция возвращает следующие результаты:

          C:\PS> TrapTest
          Обнаружена ошибка.


      Ниже показан пример инструкции Trap, выводящей ошибку с помощью 
      автоматической переменной $_:

          function TrapTest {
              trap {"Обнаружена ошибка: $_"}
              nonsenseString
              }


      При выполнении эта версия функции возвращает следующие результаты:

          C:\PS> TrapTest
          Обнаружена ошибка: условие "nonsenseString" не распознано 
          как имя командлета, функции, файла скрипта или выполняемой 
          программы. Проверьте правильность написания имени, наличие 
          и правильность пути и повторите попытку. 


      Инструкции Trap могут быть и сложнее. Инструкция Trap может 
      включать несколько условий или вызовов функций. Она может 
      записывать ошибку в журнал, тестировать или даже запускать 
      другую программу.


   Перехват определенных прерывающих ошибок

      Ниже показан пример инструкции Trap, перехватывающей ошибки типа 
      CommandNotFoundException:

          trap [System.Management.Automation.CommandNotFoundException]
              {"Перехвачена ошибка команды"}


      Когда функция или скрипт обнаруживает строку, не совпадающую с 
      какой-нибудь известной командой, эта инструкция Trap отображает 
      строку "Перехвачена ошибка команды". После выполнения 
      инструкций списка Trap Windows PowerShell записывает объект 
      ошибки в поток ошибок и продолжает выполнять скрипт.


      Windows PowerShell использует типы исключений Microsoft .NET 
      Framework 3.0. В показанном ниже примере задается тип ошибок 
      System.Exception:

          trap [System.Exception] {"Перехвачена ошибка"}


      Тип ошибок CommandNotFoundException наследуется от типа 
      System.Exception. Эта инструкция перехватывает ошибку, которую 
      создает неизвестная команда. Она, кроме того, перехватывает 
      другие типы ошибок.


      В скрипте может быть несколько инструкций Trap. Одна ошибка 
      может быть перехвачена только одной инструкцией Trap. Если 
      происходит ошибка и при этом доступно несколько инструкций 
      Trap, Windows PowerShell использует ту инструкцию Trap, тип 
      ошибок которой лучше всего соответствует ошибке. 


      В следующем примере скрипта содержится ошибка. Скрипт включает 
      общую инструкцию Trap, перехватывающую любые прерывающие 
      ошибки, и определенную инструкцию Trap, для которой задан тип 
      CommandNotFoundException.

          trap {"Перехвачена другая прерывающая ошибка" } trap 
          [System.Management.Automation.CommandNotFoundException] {"Перехвачена 
	  ошибка команды"} nonsenseString


      Выполнение скрипта приводит к таким результатам:

          Перехвачена ошибка команды
          Условие "nonsenseString" не распознано как имя командлета, 
          функции, файла скрипта или выполняемой программы. Проверьте 
          правильность написания имени, наличие и правильность пути и 
          повторите попытку.
          В C:\PS>testScript1.ps1:3 знак:19
          +   nonsenseString <<<< 


      Так как Windows PowerShell не распознает "nonsenseString" как 
      командлет или другой элемент, возвращается ошибка 
      CommandNotFoundException. Эта прерывающая ошибка перехватывается
      определенной инструкцией Trap.


      Ниже показан пример скрипта с теми же инструкциями Trap, но с 
      другой ошибкой:

          trap {"Перехвачена другая прерывающая ошибка" } 
	  trap [System.Management.Automation.CommandNotFoundException] 
              {"Перехвачена ошибка команды"}
          1/$null


      Выполнение скрипта приводит к таким результатам:

          перехвачена другая прерывающая ошибка;
          попытка деления на ноль.
          В C:PS> errorX.ps1:3 знак:7
          +   1/ <<<< $null


      Попытка поделить на ноль не создает ошибку CommandNotFoundExcept
      ion. Эта ошибка перехватывается другой инструкцией Trap, 
      предназначенной для любых прерывающих ошибок. 


  Перехват ошибок и область

      Если прерывающая ошибка происходит в той же области, где 
      находится инструкция Trap, Windows PowerShell после выполнения 
      инструкций Trap продолжает с инструкции после ошибки. Если 
      ошибка и инструкция Trap находятся в разных областях, 
      выполнение продолжается со следующей инструкции из области, в 
      которой находится инструкция Trap.
 

      Например, если ошибка происходит в функции, а инструкция Trap 
      находится в этой функции, скрипт продолжается со следующей 
      инструкции. Например, следующий скрипт содержит ошибку и 
      инструкцию Trap:

          function function1 {
              trap { "Ошибка: " }
              NonsenseString
              "function1 выполнена"
              }


      Выполнение функции Function1 в следующей части скрипта приводит 
      к таким результатам: 

          function1
          Ошибка: 
          Условие "NonsenseString" не распознано как имя командлета, 
          функции, файла скрипта или выполняемой программы. Проверьте 
          правильность написания имени, наличие и правильность пути и 
          повторите попытку.
          В C:\PS>TestScript1.ps1:3 знак:19
          +   NonsenseString <<<<

          function1 выполнена 
 

      Инструкция Trap в функции перехватывает ошибку. После вывода 
      сообщения Windows PowerShell продолжает выполнять функцию. 
      Обратите внимание, что функция Function1 была выполнена.


      Сравните это со следующим примером, в котором содержатся те же 
      ошибка и инструкция Trap. В этом примере инструкция Trap 
      выполняется вне функции:

          function function2 {
              NonsenseString
              "function2 выполнена"
              }

          trap { "Ошибка: " }
              . . .
          function2


      Выполнение функции Function2 в следующей части скрипта приводит 
      к таким результатам:

          Ошибка: 
          Условие "NonsenseString" не распознано как имя командлета, 
          функции, файла скрипта или выполняемой программы. Проверьте 
          правильность написания имени, наличие и правильность пути и 
          повторите попытку.
          В C:\PS>TestScript2.ps1:4 знак:19
          +   NonsenseString <<<<


      В этом примере не была выполнена команда "function2 завершена". 
      Несмотря на то что обе прерывающие ошибки произошли внутри 
      функции, Windows PowerShell не возвращается обратно в функцию 
      после выполнения инструкции Trap, потому что инструкция 
      находилась вне функции.


  Использование ключевых слов Break и Continue

      Ключевые слова Break и Continue можно использовать в инструкции 
      Trap, чтобы определить, будет ли скрипт или команда продолжать 
      выполняться после прерывающей ошибки. 


      Если в список инструкций Trap включена инструкция Break, 
      Windows PowerShell прерывает функцию или скрипт. Следующий 
      пример функции использует ключевое слово Break в инструкции Trap:

          C:\PS> function break_example {
              trap {"Перехвачена ошибка"; break;}
              1/$null
              "Функция выполнена."
              }

          C:\PS> break_example
          Перехвачена ошибка
          Попытка деления на ноль.
          В строке:4 знак:7


      Инструкция Trap включала ключевое слово Break, поэтому функция 
      перестала выполняться и строка "Функция выполнена" запущена не была.


      Если в инструкцию Trap включена инструкция Continue, Windows 
      PowerShell продолжает после утверждения, вызвавшего ошибку, как 
      если бы ключевых слов Break или Continue не было. Но с ключевым 
      словом Continue Windows PowerShell не записывает ошибку в поток 
      ошибок. 


      Следующий пример функции использует ключевое слово Continue в 
      инструкции Trap:

          C:\PS> function continue_example {
              trap {"Перехвачена ошибка"; continue;} 
	      1/$null
              "Функция выполнена."}

          C:\PS> continue_example
          Перехвачена ошибка
          Функция выполнена. 


      Функция продолжает выполнение после перехвата ошибки, и 
      запускается инструкция "Функция выполнена". Ошибка не 
      записывается в поток. 


СМ. ТАКЖЕ
    about_Break
    about_Continue
    about_Throw
    about_Try_Catch_Finally
    about_Scopes






Содержание