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