В этом руководстве вы узнаете, как использовать оператор SQL Server THROW для создания исключения.
- Обзор оператора THROW SQL Server
- номер_ошибки
- сообщение
- состояние
- THROW против RAISERROR
- Примеры операторов SQL Server THROW
- A) Использование оператора THROW для вызова исключения
- B) Использование оператора THROW для повторной генерации исключения
- C) Использование оператора THROW для повторной генерации исключения
Обзор оператора THROW SQL Server
Оператор THROW вызывает исключение и передает выполнение блоку CATCH конструкции TRY CATCH.
Ниже показан синтаксис оператора THROW:
THROW [ error_number , message , state ];
В этом синтаксисе:
номер_ошибки
error_number — это целое число, представляющее исключение. error_number должен быть больше 50 000 и меньше или равен 2 147 483 647.
сообщение
Сообщение представляет собой строку типа NVARCHAR(2048), описывающую исключение.
состояние
Состояние — это TINYINT со значением от 0 до 255. Состояние указывает состояние, связанное с сообщением.
Если вы не указали ни одного параметра для оператора THROW, вы должны поместить оператор THROW внутрь блока CATCH:
BEGIN TRY -- statements that may cause errors END TRY BEGIN CATCH -- statement to handle errors THROW; END CATCH
В этом случае оператор THROW вызывает ошибку, которая была перехвачена блоком CATCH.
Обратите внимание, что оператор перед оператором THROW должен заканчиваться точкой с запятой(;)
THROW против RAISERROR
В следующей таблице показана разница между операторами THROW и RAISERROR :
RAISERROR | БРОСАТЬ |
---|---|
message_id, который вы передаете в RAISERROR, должен быть определен в представлении sys.messages. | Параметр error_number не обязательно должен быть определен в представлении sys.messages. |
Параметр сообщения может содержать стили форматирования printf, такие как %s и %d. | Параметр сообщения не принимает форматирование в стиле printf. Используйте функцию FORMATMESSAGE() для подстановки параметров. |
Параметр серьезности указывает серьезность исключения. | Серьезность исключения всегда устанавливается на уровне 16. |
Примеры операторов SQL Server THROW
Давайте рассмотрим несколько примеров использования оператора THROW, чтобы лучше понять его.
A) Использование оператора THROW для вызова исключения
В следующем примере оператор THROW используется для создания исключения:
THROW 50005, N'An error occurred', 1;
Вот что получилось:
Msg 50005, Level 16, State 1, Line 1 An error occurred
B) Использование оператора THROW для повторной генерации исключения
Сначала создадим новую таблицу t1 для демонстрации:
CREATE TABLE t1( id int primary key ); GO
Затем используйте оператор THROW без аргументов в блоке CATCH, чтобы повторно выдать перехваченную ошибку:
BEGIN TRY INSERT INTO t1(id) VALUES(1); -- cause error INSERT INTO t1(id) VALUES(1); END TRY BEGIN CATCH PRINT('Raise the caught error again'); THROW; END CATCH
Вот что получилось:
(1 row affected) (0 rows affected) Raise the caught error again Msg 2627, Level 14, State 1, Line 10 Violation of PRIMARY KEY constraint 'PK__t1__3213E83F906A55AA'. Cannot insert duplicate key in object 'dbo.t1'. The duplicate key value is(1).
В этом примере первый оператор INSERT был выполнен успешно. Однако второй не удался из-за ограничения первичного ключа. Поэтому ошибка была перехвачена блоком CATCH и снова вызвана оператором THROW.
C) Использование оператора THROW для повторной генерации исключения
В отличие от оператора RAISERROR, оператор THROW не позволяет вам подставлять параметры в текст сообщения. Поэтому для имитации этой функции вы используете функцию FORMATMESSAGE().
Следующий оператор добавляет пользовательское сообщение в представление каталога sys.messages:
EXEC sys.sp_addmessage @msgnum = 50010, @severity = 16, @msgtext = N'The order number %s cannot be deleted because it does not exist.', @lang = 'us_english'; GO
В этом операторе используется message_id 50010 и заменяется заполнитель %s на идентификатор заказа «1001»:
DECLARE @MessageText NVARCHAR(2048); SET @MessageText = FORMATMESSAGE(50010, N'1001'); THROW 50010, @MessageText, 1;
Вот что получилось:
Msg 50010, Level 16, State 1, Line 8 The order number 1001 cannot be deleted because it does not exist.
В этом руководстве вы узнали, как использовать оператор SQL Server THROW для создания исключения.