Поделиться через


about_Trap

Назначение: Windows PowerShell 2.0, Windows PowerShell 3.0

РАЗДЕЛ

about_Trap

КРАТКОЕ ОПИСАНИЕ

Содержит описание ключевого слова, которое служит для обработки неустранимой ошибки.

ПОДРОБНОЕ ОПИСАНИЕ

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

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

СИНТАКСИС

Оператор Trap имеет следующий синтаксис:

          trap [[<error type>]] {<statement list>}

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

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

ПЕРЕХВАТ ВСЕХ НЕУСТРАНИМЫХ ОШИБОК

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

Ниже показан пример простейшего оператора Trap.

          trap {"Error found."}

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

          function TrapTest {
              trap {"Error found."}
              nonsenseString
              }

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

          C:\PS> TrapTest
          Error found.

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

          function TrapTest {
              trap {"Error found: $_"}
              nonsenseString
              }

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

          C:\PS> TrapTest
          Error found: The term 'nonsenseString' is not recognized as the name 
          of a cmdlet, function, script file, or operable program. Check the 
          spelling of the name, or if a path was included verify that the path 
          is correct, and then try again.

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

ПЕРЕХВАТ ОПРЕДЕЛЕННЫХ НЕУСТРАНИМЫХ ОШИБОК

Ниже показан пример оператора Trap, перехватывающего ошибки типа CommandNotFoundException.

          trap [System.Management.Automation.CommandNotFoundException] 
              {"Command error trapped"}

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

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

          trap [System.Exception] {"An error trapped"}

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

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

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

          trap {"Other terminating error trapped" }
          trap [System.Management.Automation.CommandNotFoundException] {"Command error trapped"}
          nonsenseString

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

          Command  error trapped
          The term 'nonsenseString' is not recognized as the name of a cmdlet, 
          function, script file, or operable program. Check the spelling of 
          the name, or if a path was included verify that the path is correct,
          and then try again.
          At C:\PS>testScript1.ps1:3 char:19
          +     nonsenseString <<<<

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

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

          trap {"Other terminating error trapped" }
          trap [System.Management.Automation.CommandNotFoundException] 
              {"Command error trapped"}
          1/$null

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

          Other terminating error trapped
          Attempted to divide by zero.
          At C:PS> errorX.ps1:3 char:7
          +     1/ <<<< $null

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

ПЕРЕХВАТ ОШИБОК И ОБЛАСТЬ

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

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

          function function1 {
              trap { "An error: " }
              NonsenseString
              "function1 was completed"
              }

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

          function1
          An error: 
          The term 'NonsenseString' is not recognized as the name of a cmdlet, 
          function, script file, or operable program. Check the spelling of the 
          name, or if a path was included verify that the path is correct, and 
          then try again.
          At C:\PS>TestScript1.ps1:3 char:19
          +     NonsenseString <<<<

          function1 was completed

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

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

          function function2 {
              NonsenseString
              "function2 was completed"
              }

          trap { "An error: " }
              . . .
          function2

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

          An error: 
          The term 'NonsenseString' is not recognized as the name of a cmdlet, 
          function, script file, or operable program. Check the spelling of the 
          name, or if a path was included verify that the path is correct, and 
          then try again.
          At C:\PS>TestScript2.ps1:4 char:19
          +     NonsenseString <<<<

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

ИСПОЛЬЗОВАНИЕ КЛЮЧЕВЫХ СЛОВ BREAK И CONTINUE

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

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

          C:\PS> function break_example {
              trap {"Error trapped"; break;}
              1/$null
              "Function completed."
              }

          C:\PS> break_example
          Error trapped
          Attempted to divide by zero.
          At line:4 char:7

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

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

В примере функции ниже в операторе Trap используется ключевое слово Continue.

          C:\PS> function continue_example {
              trap {"Error trapped"; continue;}
              1/$null
              "Function completed."}

          C:\PS> continue_example
          Error trapped
          Function completed.

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

СМ. ТАКЖЕ

about_Break

about_Continue

about_Scopes

about_Throw

about_Try_Catch_Finally