.

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

Инструкция Trap для обработки ошибок появилась еще в PowerShell 1.0, но я ее по-прежнему часто использую в сценариях. Технология PowerShell построена на базе. NET Framework, и ошибки имеют несколько уровней. Возвращаемое PowerShell сообщение об ошибке верхнего уровня редко помогает решить проблему. Для примера рассмотрим случай использования метода SMO CheckTables('FAST'), по сути выполняющего инструкцию DBCC CHECKDB(N'AdventureWorks', REPAIR_FAST). При вызове этого метода без блока обработки ошибок возвращается сообщение, как на рисунке 1.

 

Сообщение об ошибке, возвращаемое при использовании метода SMO CheckTables(‘FAST’)
Рисунок 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.

 

Сообщения об ошибках, возвращаемые функцией Trap
Рисунок 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"
}