Связаться по:
vkarabedyants Telegram Viber

Блог о системном администрировании серверов и сайтов

Установка, настройка программного обеспечения Linux, Windows операционных систем

Обработка ошибок в PowerShell

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

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

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

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

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

# Handle any errors that occur

Trap I

# Handle the error $err = $_.Exception write-output $err.Message while( Serr.lnnerException) {

$err = Serr.lnnerExceptionHe write-output Serr.Message

};

# End the script. Break

)

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

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 позволяет продолжить выполнение сценария после обработки ошибок без прерывания.

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

В PowerShell 2.0 был впервые реализован метод обработки ошибок Try-Catch-Finally, ставший привычным для большинства .NET-разработчиков. Этот метод

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

Пример запуска метода CheckTables

try {
# Connect to the specified instance
Ss = new-object ('Microsoft.SqIServer.Management.Smo.Server') Sinst
Sdb = $s.Databases[$dbname]
$db.CheckTables('Fast')
}
catch [System.Management.Automation.ltemNotFoundException] I
write-output "$dbname database not found"
}
catch { # Handle the error Serr = $_.Exception write-output $err.Message while( Serr.lnnerException) {
Serr = Serr.lnnerException
write-output $err.Message
I
}
finally {
write-output 'script completed" }

Оставить комментарий

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.