มันควรจะชี้ให้เห็นว่าแม้ว่ามันจะเป็นไปได้ในทางเทคนิคในการสลับระหว่างTHROW
และRAISERROR
คุณ (ส่วนใหญ่) จะไม่ต้องการทำสิ่งนี้จริง ๆ ทำไม? เนื่องจากความสามารถที่ดีของผู้ไม่ใช้พารามิเตอร์THROW
ในการโยนข้อผิดพลาดอีกครั้งโดยใช้หมายเลขข้อความเดียวกัน (เช่นMsg 8134
แทนที่จะเป็นMsg X
ที่X
> = 50000) ไม่ใช่ความแตกต่างเพียงอย่างเดียวระหว่างพวกเขาTHROW
นั่นคือการยกเลิกแบทช์ในขณะที่RAISERROR
ไม่ใช่ นี่อาจเป็นความแตกต่างด้านพฤติกรรมที่สำคัญดังแสดงด้านล่าง
ทดสอบการตั้งค่า
--DROP PROC ##Throw;
--DROP PROC ##RaisError;
GO
CREATE PROCEDURE ##Throw
AS
SET NOCOUNT ON;
BEGIN TRY
SELECT 1/0 AS [DivideByZero];
END TRY
BEGIN CATCH
THROW;
END CATCH;
SELECT 1 AS [AA];
GO
CREATE PROCEDURE ##RaisError
AS
SET NOCOUNT ON;
BEGIN TRY
SELECT 1/0 AS [DivideByZero];
END TRY
BEGIN CATCH
RAISERROR('test, yo!', 16, 1);
-- RETURN; -- typically at end of CATCH block when using RAISERROR
END CATCH;
SELECT 2 AS [BB];
GO
ทดสอบ 1
EXEC ##Throw;
SELECT 3 AS [CC];
ผลตอบแทน:
"Results" Tab:
DivideByZero
{empty result set}
"Messages" Tab:
Msg 8134, Level 16, State 1, Procedure ##Throw, Line 38
Divide by zero error encountered.
ทดสอบ 2
EXEC ##RaisError;
SELECT 4 AS [DD];
ผลตอบแทน:
"Results" Tab:
DivideByZero
{empty result set}
BB
2
DD
4
"Messages" Tab:
Msg 50000, Level 16, State 1, Procedure ##RaisError, Line 45
test, yo!
เพื่อความเป็นธรรมมันเป็นไปได้ที่จะปกปิดความแตกต่างนี้โดยทำดังต่อไปนี้:
- เสมอห่อทุกสายที่จะใช้รหัส
THROW
ภายในTRY...CATCH
โครงสร้าง (แสดงให้เห็นถึงด้านล่าง)
- อย่าวางโค้ดหลังจาก
THROW
(ดียกเว้นEND CATCH;
)
ทดสอบ 3
BEGIN TRY
EXEC ##Throw;
SELECT 5 AS [EE];
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS [ErrorNumber], ERROR_MESSAGE() AS [ErrorMessage];
END CATCH;
SELECT 6 AS [FF];
GO
ผลตอบแทน:
"Results" Tab:
DivideByZero
{empty result set}
ErrorNumber ErrorMessage
8134 Divide by zero error encountered.
FF
6
ทดสอบ 4
BEGIN TRY
EXEC ##RaisError;
SELECT 7 AS [GG];
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS [ErrorNumber], ERROR_MESSAGE() AS [ErrorMessage];
END CATCH;
SELECT 8 AS [HH];
GO
ผลตอบแทน:
"Results" Tab:
DivideByZero
{empty result set}
ErrorNumber ErrorMessage
50000 test, yo!
HH
8