THROW (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в Microsoft Fabric
Вызывает исключение и передает выполнение CATCH
блоку TRY... Конструкция CATCH .
Соглашения о синтаксисе Transact-SQL
Синтаксис
THROW [ { error_number | @local_variable }
, { message | @local_variable }
, { state | @local_variable } ]
[ ; ]
Аргументы
error_number
Константа или переменная, представляющая исключение. Аргумент error_number является int, и должен быть больше или равен 50 000, и меньше или равно 2 147 483 647.
message
Строка или переменная, описывающая исключение. Аргумент сообщения — nvarchar(2048).
state
Константа или переменная от 0 до 255, указывающая состояние, которое необходимо связать с сообщением. Аргумент состояния крошечный.
Замечания
Используйте состояние , чтобы определить источник ошибки в хранимой процедуре, триггере или пакете инструкций. Например, если вы используете одно и то же сообщение в нескольких местах, уникальное значение состояния поможет найти место возникновения ошибки.
Оператор перед THROW
оператором должен следовать за точкой с запятой (;
) терминатором инструкции.
TRY...CATCH
Если конструкция недоступна, пакет инструкции завершается. Задаются номер строки и процедура, где вызывается исключение. Для серьезности задано 16
значение .
THROW
Если инструкция указана без параметров, она должна отображаться внутри CATCH
блока. Результатом этого будет вызов возникшего исключения. Любая ошибка, возникающая в инструкции THROW
, приводит к прекращению пакета инструкций.
%
— зарезервированный символ в тексте THROW
сообщения инструкции и должен быть экранирован. Дважды символ, %
возвращаемый %
как часть текста сообщения, например 'The increase exceeded 15%% of the original value'
.
Различия между RAISERROR и THROW
В следующей таблице перечислены различия между операторами RAISERROR и THROW
операторами.
RAISERROR, инструкция | Инструкция THROW |
---|---|
Если передается RAISERROR msg_id, идентификатор должен быть определен в sys.messages . |
Параметр error_number не должен быть определен в sys.messages . |
Параметр msg_str может содержать printf стили форматирования. |
Параметр сообщения не принимает printf форматирование стиля. |
Параметр severity указывает серьезность исключения. | Нет параметра серьезности. Если THROW используется для запуска исключения, уровень серьезности всегда имеет значение 16 . Однако при THROW повторном выполнении существующего исключения уровень серьезности устанавливается на уровне серьезности этого исключения. |
Не учитывает set XACT_ABORT. | Транзакции откатываются, если задано ON значение SET XACT_ABORT. |
Примеры
А. Использование инструкции THROW для вызова исключения
В следующем примере показано использование инструкции THROW
для вызова исключения.
THROW 51000, 'The record does not exist.', 1;
Вот результирующий набор.
Msg 51000, Level 16, State 1, Line 1
The record does not exist.
B. Использование инструкции THROW для повторного вызова исключения
В следующем примере показано использование инструкции THROW
для повторного вызова последнего исключения.
USE tempdb;
GO
CREATE TABLE dbo.TestRethrow
( ID INT PRIMARY KEY
);
BEGIN TRY
INSERT dbo.TestRethrow(ID) VALUES(1);
-- Force error 2627, Violation of PRIMARY KEY constraint to be raised.
INSERT dbo.TestRethrow(ID) VALUES(1);
END TRY
BEGIN CATCH
PRINT 'In catch block.';
THROW;
END CATCH;
Вот результирующий набор.
In catch block.
Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK__TestReth__3214EC272E3BD7D3'. Cannot insert duplicate key in object 'dbo.TestRethrow'.
The statement has been terminated.
C. Использование инструкции FORMATMESSAGE с ключевым словом THROW
В следующем примере показано, как использовать функцию FORMATMESSAGE для THROW
создания настраиваемого сообщения об ошибке. В данном примере сначала создается определяемое пользователем сообщение об ошибке с помощью sp_addmessage
. THROW
Так как инструкция не разрешает параметры подстановки в параметре сообщения таким образомRAISERROR
, функция используется для передачи трех значений параметров, FORMATMESSAGE
ожидаемых сообщением 60000
об ошибке.
EXEC sys.sp_addmessage
@msgnum = 60000,
@severity = 16,
@msgtext = N'This is a test message with one numeric parameter (%d), one string parameter (%s), and another string parameter (%s).',
@lang = 'us_english';
GO
DECLARE @msg NVARCHAR(2048) = FORMATMESSAGE(60000, 500, N'First string', N'second string');
THROW 60000, @msg, 1;
Вот результирующий набор.
Msg 60000, Level 16, State 1, Line 2
This is a test message with one numeric parameter (`500`), one string parameter (First string), and another string parameter (second string).