Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы по БД.docx
Скачиваний:
239
Добавлен:
06.11.2018
Размер:
745.94 Кб
Скачать

Лабораторная работа №10: Обработка ошибок. Управление транзакциями. Триггеры. Обработка ошибок. Блок try…catch.

Стандартным способом перехвата и обработки ошибок в Transact-SQL (начиная с версии SQL Server 2005) является использование конструкции TRY...CATCH, который напоминает обработку исключений, применяемую во многих языках программирования (Delphi, C++, C# и т.д.).

Общий синтаксис конструкции TRY...CATCH следующий:

BEGIN TRY { инструкции T-SQL } END TRY BEGIN CATCH [ { инструкции T-SQL } ] END CATCH [ ; ]

Конструкция TRY…CATCH состоит из двух частей: блок TRY и блок CATCH. При обнаружении ошибки в инструкции T-SQL внутри блока TRY управление передается блоку CATCH, где эта ошибка может быть обработана.

Блок TRY начинается с инструкции BEGIN TRY и завершается инструкцией END TRY. Между ними могут быть помещены одна или несколько инструкций T-SQL, при выполнении которых может произойти ошибка.

За блоком TRY сразу же должен следовать блок обработки ошибок CATCH. Блок CATCH начинается с инструкции BEGIN CATCH и завершается инструкцией END CATCH. В Transact-SQL каждый блок TRY ассоциирован только с одним блоком CATCH.

По завершении обработки исключения блоком CATCH управление передается первой инструкции T-SQL, следующей за инструкцией END CATCH. Если инструкция END CATCH является последней инструкцией хранимой процедуры или триггера, управление возвращается коду, вызвавшему эту хранимую процедуру или триггер. Инструкции T-SQL в блоке TRY, следующие за инструкцией, вызвавшей ошибку, не выполняются.

Если в блоке TRY ошибок нет, управление передается инструкции, следующей непосредственно за связанной с ней инструкцией END CATCH. Если инструкция END CATCH является последней инструкцией хранимой процедуры или триггера, управление передается инструкции, вызвавшей эту хранимую процедуру или триггер.

Рассмотрим следующий пример:

BEGIN TRY

PRINT 'Первая попытка';

--Имитация ошибки (деление на ноль)

DECLARE @i int

SET @i = 5/0

PRINT 'Вторая попытка';

END TRY

BEGIN CATCH

PRINT 'Секция обработки ошибки';

END CATCH;

PRINT 'Третья попытка';

В результате выполнения данного блока кода будет получен следующий результат:

Первая попытка

Секция обработки ошибки

Третья попытка

В этом примере SQL Server выполняет секцию TRY, пока не встречает строку имитирующую ошибку (в данном случае деление на ноль). После этого все последующие инструкции в блоке TRY (в данном случае вывод сообщения о второй попытке) пропускаются, и управление передается в секцию CATCH. Следом за блоком CATCH выполняется следующая по порядку инструкция, выводящая сообщение о третьей попытке.

Если в данном примере закомментировать строку, вызывающую ошибку, блок TRY будет выполнен полностью, а блок CATCH - проигнорирован:

Первая попытка

Вторая попытка

Третья попытка

Активация сообщений об ошибках вручную. Инструкция raiserror

Чтобы вернуть произвольное сообщение об ошибке в вызывающую процедуру или клиентское приложение, используют команду RAISERROR.

Синтаксис этой команды следующий:

RAISERROR ( сообщение или номер ошибки, степень_серьезности, состояние, [ дополнительные_аргументы ])

Степень серьезности ошибки является указанием на то, какие меры следует принимать с учетом этой ошибки. Система обозначений степеней серьезности ошибок в СУБД SQL Server охватывает широкий спектр сообщений об ошибках, включая те, которые по существу являются информационными (со значениями степеней серьезности 1-18), считаются относящимися к системному уровню (19-25) и даже рассматриваются как катастрофические (20-25). При возникновении ошибок со степенями серьезности 20 и выше автоматически завершается работа пользовательских соединений. Если необходимо завершить выполнение процедуры и активировать в клиентской программе ошибку, как правило, указывается степень серьезности 16.

Обозначение состояния представляет собой произвольную величину. Этот параметр оператора RAISERROR был введен в действие с учетом того, что одна и та же ошибка может возникнуть в несколько местах кода. А параметр с обозначением состояния предоставляет возможность передать вместе с сообщением своего рода маркер участка кода, который показывает, где именно произошла ошибка. Числа с обозначением состояния могут находиться в пределах от 1 до 127.

Замените в предыдущем примере строку с ошибкой деления на ноль командой, генерирующей пользовательскую ошибку:

RAISERROR('Имитация ошибки',16,1)