Powershell try catch exception



about_Try_Catch_Finally

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

Описывает, как использовать блоки try , catch и finally для обработки неустранимых ошибок.

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

Используйте try блоки , catch и finally для реагирования или обработки неустранимых ошибок в скриптах. Оператор Trap также можно использовать для обработки неустранимых ошибок в скриптах. Дополнительные сведения см. в разделе about_Trap.

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

try Используйте блок , чтобы определить раздел скрипта, в котором PowerShell будет отслеживать ошибки. При возникновении ошибки в блоке try она сначала сохраняется в автоматической переменной $Error . Затем PowerShell ищет блок для catch обработки ошибки. Если в инструкции try нет соответствующего catch блока, PowerShell продолжит поиск соответствующего catch блока или Trap оператора в родительских областях. После завершения блока или если соответствующий catch catch блок или Trap оператор не найден, finally блок выполняется. Если ошибка не может быть обработана, она записывается в поток ошибок.

Блок catch может включать команды для отслеживания ошибки или восстановления ожидаемого потока скрипта. Блок catch может указать типы ошибок, которые он перехватывает. Инструкция try может включать несколько catch блоков для различных типов ошибок.

Блок finally можно использовать для освобождения всех ресурсов, которые больше не нужны вашему скрипту.

try , catch и finally напоминают ключевые try слова , catch и finally , используемые на языке программирования C#.

Синтаксис

Оператор try содержит try блок, ноль или несколько catch блоков, а также ноль или один finally блок. Оператор должен иметь по крайней try мере один catch блок или один finally блок.

Ниже показан try синтаксис блока.

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

Ниже показан catch синтаксис блока.

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

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

Блок catch может указывать один или несколько типов ошибок. Тип ошибки — это исключение платформа .NET Framework Майкрософт или исключение, которое является производным от платформа .NET Framework исключения. Блок catch обрабатывает ошибки указанного платформа .NET Framework класса исключений или любого класса, производного от указанного класса.

catch Если блок указывает тип ошибки, этот catch блок обрабатывает этот тип ошибки. catch Если блок не указывает тип ошибки, он catch обрабатывает все ошибки, возникшие в блоке try . Инструкция try может включать несколько catch блоков для различных указанных типов ошибок.

Ниже показан finally синтаксис блока.

За finally ключевым словом следует список инструкций, который выполняется каждый раз при выполнении скрипта, даже если try инструкция выполнялась без ошибок или в инструкции была обнаружена catch ошибка.

Обратите внимание, что нажатие клавиши CTRL + C останавливает конвейер. Объекты, отправляемые в конвейер, не будут отображаться в качестве выходных данных. Таким образом, если включить отображаемую инструкцию, например «Finally block has run», она не будет отображаться после нажатия клавиш CTRL + C , даже если finally блок запущен.

Читайте также:  Error 193 0xc1 при запуске службы

выявления ошибок;

В следующем примере скрипта try показан блок с блоком catch :

Ключевое catch слово должно немедленно следовать за блоком try или другим блоком catch .

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

Когда скрипт обнаруживает «NonsenseString», это приводит к неустранимой ошибке. Блок catch обрабатывает ошибку, выполняя список инструкций внутри блока.

Использование нескольких операторов catch

Инструкция try может содержать любое количество catch блоков. Например, следующий скрипт имеет try блок, который загружает MyDoc.doc , и содержит два catch блока:

Первый catch блок обрабатывает ошибки типов System.Net.WebException и System.IO.IOException . Во втором catch блоке не указан тип ошибки. Второй catch блок обрабатывает любые другие неустранимые ошибки.

PowerShell сопоставляет типы ошибок по наследованию. Блок catch обрабатывает ошибки указанного платформа .NET Framework класса исключений или любого класса, производного от указанного класса. В следующем примере содержится catch блок, который перехватывает ошибку «Command Not Found» (Команда не найдена):

Указанный тип ошибки CommandNotFoundException наследуется от типа System.SystemException . В следующем примере также обнаруживается ошибка Command Not Found ( Команда не найдена):

Этот catch блок обрабатывает ошибку «Команда не найдена» и другие ошибки, которые наследуются от типа SystemException .

Если указан класс ошибок и один из его производных классов, поместите catch блок для производного класса перед блоком catch для общего класса.

PowerShell создает оболочку для всех исключений в тип RuntimeException . Таким образом, указание типа ошибки System.Management.Automation.RuntimeException ведет себя так же, как неквалифицированный блок catch.

Использование ловушек в пробном перехвате

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

Если объект существует в блоке выше , чем try , и в текущей Trap области нет соответствующего catch блока, Trap объект будет принимать управление, даже если любая родительская область имеет соответствующий catch блок.

Доступ к сведениям об исключении

В блоке catch доступ к текущей ошибке можно получить с помощью $_ , который также называется $PSItem . Объект имеет тип ErrorRecord.

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

Доступны дополнительные свойства, например ScriptStackTrace, Exception и ErrorDetails. Например, если мы изменим скрипт на следующий:

Результат будет выглядеть примерно так:

Освобождение ресурсов с помощью finally

Чтобы освободить ресурсы, используемые скриптом, добавьте finally блок после try блоков и catch . Инструкции finally block выполняются независимо от того, возникает ли try в блоке неустранимая ошибка. PowerShell запускает finally блок до завершения скрипта или до выхода текущего блока за пределы области действия.

Блок finally выполняется, даже если для остановки скрипта используется клавиша CTRL + C . Блок finally также запускается, если ключевое слово Exit останавливает скрипт из catch блока.

Источник

Обработка ошибок с исключениями в Powershell с Try и Catch

02 октября 2020

В Powershell существует несколько уровней ошибок и несколько способов их обработать. Проблемы одного уровня (Non-Terminating Errors) можно решить с помощью привычных для Powershell команд. Другой уровень ошибок (Terminating Errors) решается с помощью исключений (Exceptions) стандартного, для большинства языков, блока в виде Try, Catch и Finally.

Навигация по посту

Как Powershell обрабатывает ошибки

До рассмотрения основных методов посмотрим на теоретическую часть.

Автоматические переменные $Error

В Powershell существует множество переменных, которые создаются автоматически. Одна из таких переменных — $Error хранит в себе все ошибки за текущий сеанс PS. Например так я выведу количество ошибок и их сообщение за весь сеанс:

Читайте также:  Python one line exception

При отсутствии каких либо ошибок мы бы получили пустой ответ, а счетчик будет равняться 0:

Переменная $Error являет массивом и мы можем по нему пройтись или обратиться по индексу что бы найти нужную ошибку:

Свойства объекта $Error

Так же как и все что создается в Powershell переменная $Error так же имеет свойства (дополнительную информацию) и методы. Названия свойств и методов можно увидеть через команду Get-Member:

Например, с помощью свойства InvocationInfo, мы можем вывести более структурный отчет об ошибки:

Методы объекта $Error

Например мы можем очистить логи ошибок используя clear:

Критические ошибки (Terminating Errors)

Критические (завершающие) ошибки останавливают работу скрипта. Например это может быть ошибка в названии командлета или параметра. В следующем примере команда должна была бы вернуть процессы «svchost» дважды, но из-за использования несуществующего параметра ‘—Error’ не выполнится вообще:

Не критические ошибки (Non-Terminating Errors)

Не критические (не завершающие) ошибки не остановят работу скрипта полностью, но могут вывести сообщение об этом. Это могут быть ошибки не в самих командлетах Powershell, а в значениях, которые вы используете. На предыдущем примере мы можем допустить опечатку в названии процессов, но команда все равно продолжит работу:

Как видно у нас появилась информация о проблеме с первым процессом ‘svchost111’, так как его не существует. Обычный процесс ‘svchost’ он у нас вывелся корректно.

Параметр ErrorVariable

Если вы не хотите использовать автоматическую переменную $Error, то сможете определять свою переменную индивидуально для каждой команды. Эта переменная определяется в параметре ErrorVariable:

Переменная будет иметь те же свойства, что и автоматическая:

Повторное использование логина и пароля в Powershell с Get-Credential и их шифрование

Обработка некритических ошибок

У нас есть два способа определения последующих действий при ‘Non-Terminating Errors’. Это правило можно задать локально и глобально (в рамках сессии). Мы сможем полностью остановить работу скрипта или вообще отменить вывод ошибок.

Приоритет ошибок с $ErrorActionPreference

Еще одна встроенная переменная в Powershell $ErrorActionPreference глобально определяет что должно случится, если у нас появится обычная ошибка. По умолчанию это значение равно ‘Continue’, что значит «вывести информацию об ошибке и продолжить работу»:

Если мы поменяем значение этой переменной на ‘Stop’, то поведение скриптов и команд будет аналогично критичным ошибкам. Вы можете убедиться в этом на прошлом скрипте с неверным именем процесса:

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

Ниже значение, которые мы можем установить в переменной $ErrorActionPreference:

  • Continue — вывод ошибки и продолжение работы;
  • Inquire — приостановит работу скрипта и спросит о дальнейших действиях;
  • SilentlyContinue — скрипт продолжит свою работу без вывода ошибок;
  • Stop — остановка скрипта при первой ошибке.

Самый частый параметр, который мне приходится использовать — SilentlyContinue:

Использование параметра ErrorAction

Переменная $ErrorActionPreference указывает глобальный приоритет, но мы можем определить такую логику в рамках команды с параметром ErrorAction. Этот параметр имеет больший приоритет чем $ErrorActionPreference. В следующем примере, глобальная переменная определяет полную остановку скрипта, а в параметр ErrorAction говорит «не выводить ошибок и продолжить работу»:

Кроме ‘SilentlyContinue’ мы можем указывать те же параметры, что и в переменной $ErrorActionPreference.

Значение Stop, в обоих случаях, делает ошибку критической.

Читайте также:  Ошибка соединения socket error 10054 connection reset by peer

Обработка критических ошибок и исключений с Try, Catch и Finally

Когда мы ожидаем получить какую-то ошибку и добавить логику нужно использовать Try и Catch. Например, если в вариантах выше мы определяли нужно ли нам отображать ошибку или останавливать скрипт, то теперь сможем изменить выполнение скрипта или команды вообще. Блок Try и Catch работает только с критическими ошибками и в случаях если $ErrorActionPreference или ErrorAction имеют значение Stop.

Например, если с помощью Powershell мы пытаемся подключиться к множеству компьютеров один из них может быть выключен — это приведет к ошибке. Так как эту ситуацию мы можем предвидеть, то мы можем обработать ее. Процесс обработки ошибок называется исключением (Exception).

Синтаксис и логика работы команды следующая:

Блок try мониторит ошибки и если она произойдет, то она добавится в переменную $Error и скрипт перейдет к блоку Catch. Так как ошибки могут быть разные (нет доступа, нет сети, блокирует правило фаервола и т.д.) то мы можем прописывать один блок Try и несколько Catch:

Сам блок finally — не обязательный и используется редко. Он выполняется самым последним, после try и catch и не имеет каких-то условий.

Catch для всех типов исключений

Как и было показано выше мы можем использовать блок Catch для конкретного типа ошибок, например при проблемах с доступом. Если в этом месте ничего не указывать — в этом блоке будут обрабатываться все варианты ошибок:

Такой подход не рекомендуется использовать часто, так как вы можете пропустить что-то важное.

Мы можем вывести в блоке catch текст ошибки используя $PSItem.Exception:

Переменная $PSItem хранит информацию о текущей ошибке, а глобальная переменная $Error будет хранит информацию обо всех ошибках. Так, например, я выведу одну и ту же информацию:

Создание отдельных исключений

Что бы обработать отдельную ошибку сначала нужно найти ее имя. Это имя можно увидеть при получении свойств и методов у значения переменной $Error:

Так же сработает и в блоке Catch с $PSItem:

Для вывода только имени можно использовать свойство FullName:

Далее, это имя, мы вставляем в блок Catch:

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

Создание и изменение в Powershell NTFS разрешений ACL

Выброс своих исключений

Иногда нужно создать свои собственные исключения. Например мы можем запретить добавлять через какой-то скрипт названия содержащие маленькие буквы или сотрудников без указания возраста и т.д. Способов создать такие ошибки — два и они тоже делятся на критические и обычные.

Выброс с throw

Throw — выбрасывает ошибку, которая останавливает работу скрипта. Этот тип ошибок относится к критическим. Например мы можем указать только текст для дополнительной информации:

Если нужно, то мы можем использовать исключения, которые уже были созданы в Powershell:

Использование Write-Error

Команда Write-Error работает так же, как и ключ ErrorAction. Мы можем просто отобразить какую-то ошибку и продолжить выполнение скрипта:

При необходимости мы можем использовать параметр ErrorAction. Значения этого параметра были описаны выше. Мы можем указать значение ‘Stop’, что полностью остановит выполнение скрипта:

Отличие команды Write-Error с ключом ErrorAction от обычных команд в том, что мы можем указывать исключения в параметре Exception:

В Exception мы так же можем указывать сообщение. При этом оно будет отображаться в переменной $Error:

Источник

Оцените статью
toolgir.ru
Adblock
detector