THROW (Transact-SQL)
在 SQL Server 2012 中引發例外狀況,並將執行轉移至 TRY…CATCH 建構的 CATCH 區塊。
語法
THROW [ { error_number | @local_variable },
{ message | @local_variable },
{ state | @local_variable } ]
[ ; ]
引數
error_number
這是代表例外狀況的常數或變數。 error_number 是 int,必須大於或等於 50000,並小於或等於 2147483647。message
這是描述例外狀況的字串或變數。 message 是 nvarchar(2048)。state
這是介於 0 和 255 之間的常數或變數,表示要與訊息相關聯的狀態。 state 是 tinyint。
備註
THROW 陳述式之前的陳述式後面必須接著分號 (;) 陳述式結束字元。
如果沒有 TRY…CATCH 建構,就會結束工作階段。 系統會設定引發例外狀況的行號和程序。 嚴重性設為 16。
如果指定不含參數的 THROW 陳述式,它必須出現在 CATCH 區塊內。 這會導致引發攔截到的例外狀況。 THROW 陳述式中發生的任何錯誤都會導致陳述式批次結束。
RAISERROR 和 THROW 之間的差異
下表列出 RAISERROR 和 THROW 陳述式之間的某些差異。
RAISERROR 陳述式 |
THROW 陳述式 |
---|---|
如果將 msg_id 傳遞給 RAISERROR,識別碼必須定義在 sys.messages。 |
error_number 參數不必定義在 sys.messages。 |
msg_str 參數可以包含 printf 格式化樣式。 |
message 參數不接受 printf 樣式格式。 |
severity 參數指定例外狀況的嚴重性。 |
沒有任何 severity 參數。 例外狀況嚴重性永遠設為 16。 |
範例
A.使用 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;
以下為結果集:
PRINT '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 陳述式不允許在 message 參數中使用替代參數 (而 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).
請參閱
參考
ERROR_PROCEDURE (Transact-SQL)