.
Инструкция Trap для обработки ошибок
Инструкция Trap для обработки ошибок появилась еще в PowerShell 1.0, но я ее по-прежнему часто использую в сценариях. Технология PowerShell построена на базе. NET Framework, и ошибки имеют несколько уровней. Возвращаемое PowerShell сообщение об ошибке верхнего уровня редко помогает решить проблему. Для примера рассмотрим случай использования метода SMO CheckTables('FAST'), по сути выполняющего инструкцию DBCC CHECKDB(N'AdventureWorks', REPAIR_FAST). При вызове этого метода без блока обработки ошибок возвращается сообщение, как на рисунке 1.
Рисунок 1. Сообщение об ошибке, возвращаемое при использовании метода SMO CheckTables (‘FAST’) |
Очевидно, что такое сообщение не несет никакой полезной информации, поэтому я часто использую функцию Trap:
# Handle any errors that occur Trap { # Handle the error $err = $_.Exception write-output $err.Message while( $err.InnerException ) { $err = $err.InnerExceptionне write-output $err.Message }; # End the script. Break }
Это позволяет при вызове метода CheckTables('FAST') получить сообщение, подобное приведенному на рисунке 2.
Рисунок 2. Сообщения об ошибках, возвращаемые функцией Trap |
Это сообщение содержит гораздо больше полезной информации и позволяет точно выяснить, в чем состоит проблема, и как ее решить. Ключевое слово break после точки с запятой в инструкции trap инициирует прекращение сценария после обнаружения и обработки ошибки. Ключевое слово continue позволяет продолжить выполнение сценария после обработки ошибок без прерывания.
Метод обработки ошибок Try-Catch-Finally
В PowerShell 2.0 был впервые реализован метод обработки ошибок Try-Catch-Finally, ставший привычным для большинства. NET-разработчиков. Этот метод отличается значительно большей гибкостью в обработке возможных проблем. Дополнительным преимуществом метода является возможность указывать различные типы обработки ошибок для разных ошибок. В приведенном в листинге примере также демонстрируется запуск метода CheckTables. Однако в данном случае каждый объект ItemNotFoundException обрабатывается отдельно, после чего обрабатываются все оставшиеся ошибки способом, аналогичным показанному в инструкции trap.
Очевидно, что такой вариант позволяет обрабатывать различные ошибки, а тот факт, что блоки Try-Catch-Finally могут быть вложенными, обеспечивает широкие возможности управления сценариями.
Листинг. Пример запуска метода CheckTables
try { # Connect to the specified instance $s = new-object ('Microsoft.SqlServer.Management.Smo.Server') $inst $db = $s.Databases[$dbname] $db.CheckTables('Fast') } catch [System.Management.Automation.ItemNotFoundException] { write-output»$dbname database not found« } catch { # Handle the error $err = $_.Exception write-output $err.Message while( $err.InnerException ) { $err = $err.InnerException write-output $err.Message } } finally { write-output»script completed" }