Всем привет. Недавно мы публиковали пару статей о том, как решить ошибку Access is Denied, и как игнорировать ошибки. Но можно пойти другим путем. В Powershell как и во многих языках программирования есть конструкция try catch. В этой статье мы поговорим про эту конструкцию и разберем ее работу.
Powershell — Try Catch
Конструкция try catch имеет 2 блока выполнения скрипта. Она очень похожа на конструкцию if () {} else {}, но без проверки условия. В первом блоке try, пишется код, который необходимо выполнить, а во втором блоке код, который будет выполнен в результате неудачного выполнения первого блока. Рассмотрим пример. Попробуем выполнить несуществующий командлет с блоком try catch:
1 2 3 |
try { NonsenseString } catch { "An error occurred." } An error occurred. |
Логично, что при попытке выполнить несуществующую команда powershell вернет ошибку, но в нашей ситуации возвращается наша кастомная ошибка.
Еще пример, в котором используется 2 блока catch:
1 2 3 4 5 6 7 8 9 10 11 |
try { $wc = new-object System.Net.WebClient $wc.DownloadFile("http://www.contoso.com/MyDoc.doc","c:\temp\MyDoc.doc") } catch [System.Net.WebException],[System.IO.IOException] { "Unable to download MyDoc.doc from http://www.contoso.com." } catch { "An error occurred that could not be resolved." } Unable to download MyDoc.doc from http://www.contoso.com. |
Разбираемся. В первом блоке catch отлавливаются исключения относящиеся к System.Net.WebException и System.IO.IOException. Во втором блоке catch будут пойманы все остальные ошибки в результате которых на экране появился сообщение из второго блока.
Помимо кастомных ошибок, можно получать и системные ошибки текстом. Для этого преобразуем всю конструкцию таким образом:
1 2 3 4 5 6 7 8 |
try { NonsenseString } catch { Write-Host "An error occurred:" Write-Host $_ } An error occurred: Имя "NonsenseString" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего повторите попытку. |
Очень удобный вывод системных ошибок без красного цвета. Помимо получения системного исключения в виде текста, так же можно получить доступ к следующим типам исключений: ScriptStackTrace , Exception и ErrorDetails. Давайте попробуем все:
1 2 3 4 5 6 7 |
try { NonsenseString } catch { Write-Host "An error occurred:" Write-Host $_.ScriptStackTrace } An error occurred: в <ScriptBlock>, <Нет файла>: строка 1 |
1 2 3 4 5 6 7 8 9 10 11 |
try { NonsenseString } catch { Write-Host "An error occurred:" Write-Host $_.Exception } An error occurred: System.Management.Automation.CommandNotFoundException: Имя "NonsenseString" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего повторите попытку. в System.Management.Automation.ExceptionHandlingOps.CheckActionPreference(FunctionContext funcContext, Exception exception) в System.Management.Automation.Interpreter.ActionCallInstruction`2.Run(InterpretedFrame frame) в System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame) в System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame) |
1 2 3 4 5 6 |
try { NonsenseString } catch { Write-Host "An error occurred:" Write-Host $_.ErrorDetails } An error occurred: |
В нашем случае детали ошибки отсутствуют.
Во всей конструкции существует блок Finally. Он не блокируется ошибками блоков try и catch, и выполняется даже тогда, когда вы нажимаете Ctrl + C.
Итог
Конструкция try catch позволит вам отслеживать ошибки выполнения кода, к тому же если есть код, который должен выполниться не смотря ни на что должен быть помещен к блок Finally. Надеюсь статья была полезна и поучительна для вас! Спасибо за внимание, не забывайте подписываться на нашу группу в ВК, канал на ютубе и залетайте в наш телеграм канал! Если у вас остались вопросы, пишите их в комментариях!