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


Сведения о ловушке

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

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

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

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

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

  • Отображение ошибки после обработки блока инструкций trap и продолжения выполнения скрипта или функции, содержащей 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 инструкция , 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 (Функция 2 была завершена) не была выполнена. В обоих примерах неустранимая ошибка возникает в функции . Однако 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.

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

about_Break

about_Continue

about_Scopes

about_Throw

about_Try_Catch_Finally