Rate this post

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

Инструкция Trap для обработки ошибок

Инструкция Trap для обработки ошибок появилась еще в PowerShell 1.0, но я ее по-прежнему часто использую в сценариях. Технология PowerShell построена на базе .NET Framework, и ошибки имеют несколько уров­ней. Возвращаемое PowerShell сообщение об ошибке верхнего уровня редко помогает решить проблему. Для примера рассмотрим случай использования мето­да SMO CheckTablesCFAST’), по сути выполняюще­го инструкцию DBCC CHECKDB (NAdventureWorks’, REPAIRFAST). При вызове этого метода без блока обработки ошибок возвращается сообщение:n

Exception calling "CheckTables with "1" argument(s): "Check tables failed for Database 'AdventureWorks'."

Очевидно, что такое сообщение не несет никакой полезной информации, поэтому я часто использую функцию Trap:n

# Handle any errors that occurnnTrap Inn# Handle the error $err = $_.Exception write-output $err.Message while( Serr.lnnerException) {nn$err = Serr.lnnerExceptionHe write-output Serr.Messagenn};nn# End the script. Breaknn)

Это позволяет при вызове метода CheckTables (‘FAST’) получить сообщение, подобноеn

An exception occurred while executing a Transact-SQL statement or batch. Repair statement not processed. Database needs to be in single user mode.

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

Метод обработки ошибок Try-Catch-Finally

В PowerShell 2.0 был впервые реализован метод обработки ошибок Try-Catch-Finally, ставший привычным для большинства .NET-разработчиков. Этот методnnботке возможных проблем. Дополнительным преимуществом метода является возможность указывать различные типы обработки ошибок для разных ошибок. В приведенном в листинге примере также демонстрируется запуск метода CheckTables. Однако в данном случае каждый объект ItemNotFoundException обрабатывается отдельно, после чего обрабатываются все оставшиеся ошибки способом, аналогичным показанному в инструкции trap.nОчевидно, что такой вариант позволяет обрабатывать различные ошибки, а тот факт, что блоки Try-Catch-Finally могут быть вложенными, обеспечивает широкие возможности управления сценариями.nnПример запуска метода CheckTablesn

try {n# Connect to the specified instancenSs = new-object ('Microsoft.SqIServer.Management.Smo.Server') SinstnSdb = $s.Databases[$dbname]n$db.CheckTables('Fast')n}ncatch [System.Management.Automation.ltemNotFoundException] Inwrite-output "$dbname database not found"n}ncatch { # Handle the error Serr = $_.Exception write-output $err.Message while( Serr.lnnerException) {nSerr = Serr.lnnerExceptionnwrite-output $err.MessagenIn}nfinally {nwrite-output 'script completed" }