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" }