Недавно добавленная функция try catch в sql server 2005 может легко перехватывать исключения. Сегодня я рассмотрю ее и суммирую основные моменты следующим образом
.
{ sql_statement |
оператор_блок }
КОНЕЦ ПОПРОБУЙТЕ
НАЧАТЬ ЛОВИТЬ
{ sql_statement |
оператор_блок }
КОНЦЕВАЯ ЗАЩЕЛКА
, аналогично использованию обработки исключений в обычных языках, но следует отметить, что SQL SERVER перехватывает только несерьезные исключения. Когда такие исключения, как база данных, не могут быть подключены и т. д., их невозможно перехватить. Пример: НАЧАТЬ ПОПРОБОВАТЬ
ОБЪЯВИТЬ @X INT
-- Делим на ноль, чтобы сгенерировать ошибку
НАБОР @X = 1/0
PRINT 'Команда после ошибки в блоке TRY'
КОНЕЦ ПОПРОБУЙТЕ
НАЧАТЬ ЛОВИТЬ
ПЕЧАТЬ «Обнаружена ошибка»
КОНЦЕВАЯ ЗАЩЕЛКА
PRINT 'Команда после блоков TRY/CATCH'
Кроме того, команда try catch может быть вложена в Begin TRY.
удалить из GrandParent, где Name = 'John Smith'
напечатать «GrandParent успешно удален»
Конец попытки
Начать ловлю
Печать «Ошибка удаления записи GrandParent»
Начать Попробовать
удалить из родителя, где GrandParentID =
(выберите отдельный идентификатор из GrandParent, где Имя = «Джон Смит»)
Распечатать «Родительский элемент успешно удален»
Конец попытки
Начать ловлю
напечатать «Ошибка удаления родителя»
Начать Попробовать
удалить из дочернего элемента, где ParentId =
(выберите отдельный идентификатор от родителя, где GrandParentID =
(выберите отдельный идентификатор из GrandParent, где Имя = «Джон Смит»))
напечатать «Дочерний элемент успешно удален»
Конец попытки
Начать ловлю
Распечатать «Ошибка удаления дочернего элемента»
Конец улова
Конец улова
Конец улова
Кроме того, SQL SERVER 2005 предоставляет методы класса ошибок в механизме исключений для облегчения отладки. Это относительно просто и не будет объясняться. ERROR_NUMBER(): Возвращает число, связанное с ошибкой.ERROR_SEVERITY(): Возвращает серьезность ошибки.ERROR_STATE(): Возвращает номер состояния ошибки, связанный с ошибкой.ERROR_PROCEDURE(): Возвращает имя хранимой процедуры или триггера, в котором произошла ошибка.ERROR_LINE(): Возвращает номер строки внутри сбойная процедура, вызвавшая ошибку. ERROR_MESSAGE(): возвращает полный текст сообщения об ошибке. Текст включает значения, предоставленные для любых заменяемых параметров, таких как длины, имена объектов или время. Последний пример выглядит следующим образом: используя метод класса ошибок BEGIN TRY
ОБЪЯВИТЬ @X INT
-- Делим на ноль, чтобы сгенерировать ошибку
НАБОР @X = 1/0
PRINT 'Команда после ошибки в блоке TRY'
КОНЕЦ ПОПРОБУЙТЕ
НАЧАТЬ ЛОВИТЬ
ПЕЧАТЬ «Обнаружена ошибка»
ВЫБЕРИТЕ ERROR_NUMBER() ERNumber,
ERROR_SEVERITY() Ошибка_Серьезность,
ERROR_STATE() Состояние_ошибки,
ERROR_PROCEDURE() Ошибка_процедуры,
ERROR_LINE() Error_Line,
ERROR_MESSAGE() Сообщение_ошибки
КОНЦЕВАЯ ЗАЩЕЛКА
PRINT 'Команда после блоков TRY/CATCH'
Наконец, обнаружена ошибка вывода
Err_Num Err_Sev Err_State Err_Proc Err_Line Err_Msg
------- ------- --------- -------------------- ------- ----------------------------------
8134 16 1 NULL 4 Обнаружена ошибка деления на ноль
Источник: jackyrong BLOG.