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


about_Trap

Краткое описание

Описывает ключевое слово, обрабатывающий неустранимую ошибку.

Подробное описание

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

В trap ключевое слово указывается список инструкций, выполняемых при возникновении неустранимой ошибки. trap Операторы могут обрабатывать устранимые ошибки следующими способами:

  • Отображает ошибку после обработки блока инструкций trap и продолжения выполнения скрипта или функции, содержащей trap. Это поведение по умолчанию.

    Примечание

    При возникновении завершающей ошибки в подчиненном блоке скрипта, например if в операторе или foreach цикле, операторы в trap блоке выполняются и выполнение продолжается при следующем операторе за пределами подчиненного блока скрипта.

  • Отображение ошибки и прерывание выполнения скрипта или функции, содержащей trap метод using break , в инструкции trap .

  • Заглушить ошибку, но продолжить выполнение скрипта или функции, содержащей , trap с помощью continue в инструкции trap .

Список инструкций может включать несколько условий trap или вызовов функций. Может trap записывать журналы, тестовые условия или даже запускать другую программу.

Синтаксис

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

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

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

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

Перехват всех устранимых ошибок

При возникновении неустранимой ошибки, которая не обрабатывается другим способом в скрипте или команде, PowerShell проверяет наличие trap инструкции, которая обрабатывает ошибку. При наличии инструкции trap PowerShell продолжит выполнение скрипта или команды в инструкции trap .

В следующем примере показана очень простая trap инструкция:

trap {"Error found."}

Эта trap инструкция перехватывает все неустранимые ошибки.

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

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

TrapTest

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

Error found.
nonsenseString:
Line |
   3 |      nonsenseString
     |      ~~~~~~~~~~~~~~
     | 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 try again.

В следующем примере приведен оператор trap , отображающий ошибку с помощью автоматической переменной $_ :

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

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 try again.
nonsenseString:
Line |
   3 |      nonsenseString
     |      ~~~~~~~~~~~~~~
     | 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 try again.

Важно!

trapоператоры могут быть определены в любом месте в пределах заданного область, но всегда применяются ко всем операторам в этом область. Во время выполнения trap операторы в блоке определяются перед выполнением любых других инструкций. В JavaScript это называется подъемом. Это означает, что trap операторы применяются ко всем операторам в этом блоке, даже если выполнение не прошло точку, в которой они определены. Например, при определении в конце скрипта и при возникновении ошибки в первом операторе по-прежнему trap активируется trap.

Перехват конкретных ошибок

Скрипт или команда может иметь несколько trap операторов. Можно trap определить для обработки определенных ошибок.

В следующем примере показан оператор trap , который перехватывает конкретную ошибку CommandNotFoundException:

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

Если функция или скрипт обнаруживает строку, которая не соответствует известной команде, эта trap инструкция отображает строку "Command error trapped". После выполнения списка инструкций trap PowerShell записывает объект ошибки в поток ошибок, а затем продолжает выполнение скрипта.

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

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

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

В скрипте может быть несколько trap операторов. Каждый тип ошибки может быть захвачен только одним trap оператором. При возникновении неустранимой ошибки PowerShell выполняет trap поиск с наиболее конкретным совпадением, начиная с текущего область выполнения.

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

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

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

Command error trapped
nonsenseString:
Line |
   5 |  nonsenseString
     |  ~~~~~~~~~~~~~~
     | 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 try again.

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

Следующий пример скрипта содержит те же trap инструкции с другой ошибкой:

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

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

Other terminating error trapped
RuntimeException:
Line |
   4 |  1/$null
     |  ~~~~~~~
     | Attempted to divide by zero.

Попытка деления на ноль не создает ошибку CommandNotFoundException . Вместо этого эта ошибка перехватывается другой trap инструкцией, которая перехватывает любую неустранимую ошибку.

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

По умолчанию при возникновении неустранимой ошибки выполнение передается оператору trap. trap После выполнения блока управление возвращается к следующему блоку инструкции после расположения ошибки.

Например, если в foreach операторе возникает неустранимая ошибка, trap инструкция выполняется, а выполнение продолжается в следующем операторе foreach после блока, а не в блоке foreach .

trap { 'An error occurred!'}
foreach ($x in 3..0) {
   1/$x
   'after division'
}
'after loop'
0.333333333333333
after division
0.5
after division
1
after division
An error occurred!
RuntimeException: untitled:Untitled-1:3:4
Line |
   3 |     1/$x
     |     ~~~~
     | Attempted to divide by zero.

after loop

В выходных данных выше вы увидите, что циклы продолжаются до последней итерации. Когда скрипт пытается разделить 1 на 0, возникает неустранимая ошибка. Остальная часть foreach scriptblock пропускается, try инструкция выполняется и скрипт продолжается после foreach scriptblock.

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

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

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

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

function1

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

An error:
NonsenseString:
Line |
   3 |      NonsenseString
     |      ~~~~~~~~~~~~~~
     | 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 try again.
function1 was completed

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

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

function function2 {
    NonsenseString
    "function2 was completed"
}

trap { "An error: " }

function2

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

An error:
NonsenseString:
Line |
   2 |      NonsenseString
     |      ~~~~~~~~~~~~~~
     | 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 try again.

В этом примере команда "function2 was completed" не была выполнена. В обоих примерах в функции возникает неустранимая ошибка. Однако в этом примере trap оператор находится за пределами функции . PowerShell не возвращается в функцию после выполнения инструкции trap .

Внимание!

Если для одного условия ошибки определено несколько ловушек, используется первая trap лексическая (самая высокая в область).

В следующем примере выполняется только trap с "whoops 1".

Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { "whoops 1"; continue }
trap { "whoops 2"; continue }

Важно!

Оператор Trap ограничен тем местом, где она компилируется. Если внутри функции или скрипта с точечным источником имеется trap оператор, то при выходе из функции или точечных исходных скриптов все trap инструкции внутри удаляются.

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

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

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

function break_example {
    trap {
        "Error trapped"
        break
    }
    1/$null
    "Function completed."
}

break_example
Error trapped
ParentContainsErrorRecordException:
Line |
   6 |      1/$null
     |      ~~~~~~~
     | Attempted to divide by zero.

trap Поскольку инструкция включала break ключевое слово, функция не продолжает выполняться, а строка "Функция завершена" не выполняется.

При включении continue ключевое слово в инструкцию trap PowerShell возобновляет работу после оператора, вызвавшего ошибку, так же, как и без break оператора или continue. Однако при continue использовании ключевое слово PowerShell не записывает ошибку в поток ошибок.

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

function continue_example {
    trap {
        "Error trapped"
        continue
    }
    1/$null
    "Function completed."
}

continue_example
Error trapped
Function completed.

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

Примечания

trapИнструкции предоставляют простой способ обеспечить обработку всех устранимых ошибок в область. Для более точной обработки ошибок используйте try/catch блоки, в которых ловушки определяются с помощью catch инструкций . Операторы catch применяются только к коду в связанной try инструкции. Дополнительные сведения см. в разделе about_Try_Catch_Finally.

См. также раздел