หากคุณใช้บล็อก try / catch หมายเลขข้อผิดพลาด raiserror ที่มีความรุนแรง 11-19 จะทำให้การดำเนินการข้ามไปที่บล็อก catch
ความรุนแรงใด ๆ ที่สูงกว่า 16 ถือเป็นข้อผิดพลาดของระบบ เพื่อสาธิตรหัสต่อไปนี้ตั้งค่าบล็อก try / catch และดำเนินการตามขั้นตอนการจัดเก็บที่เราถือว่าล้มเหลว:
สมมติว่าเรามีตาราง [dbo] [ข้อผิดพลาด] เพื่อเก็บข้อผิดพลาดสมมติว่าเรามีกระบวนงานที่เก็บไว้ [dbo] [AssumeThisFails] ซึ่งจะล้มเหลวเมื่อเราดำเนินการ
if (object_id('tempdb..
create table
declare @tc as int;
set @tc = @@trancount;
if (@tc = 0)
begin transaction;
else
save transaction myTransaction;
begin try
declare @return_value = '0';
set @return_value = '0';
declare
@ErrorNumber as int,
@ErrorMessage as varchar(400),
@ErrorSeverity as int,
@ErrorState as int,
@ErrorLine as int,
@ErrorProcedure as varchar(128);
exec @return_value = [dbo].[AssumeThisFails]
if (@return_value <> 0)
raiserror('This is my error message', 17, 1);
if (@tc = 0)
commit transaction;
return(0);
end try
begin catch
select
@ErrorNumber = ERROR_NUMBER(),
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE(),
@ErrorLine = ERROR_LINE(),
@ErrorProcedure = ERROR_PROCEDURE();
insert
values (@ErrorNumber, @ErrorMessage, @ErrorSeverity, @ErrorState, @ErrorLine, @ErrorProcedure);
if (@tc = 0)
begin
if (XACT_STATE() <> 0)
begin
select * from
rollback transaction;
insert into [dbo].[Errors] (ErrorNumber, ErrorMessage, ErrorSeverity, ErrorState, ErrorLine, ErrorProcedure)
select * from
insert [dbo].[Errors] (ErrorNumber, ErrorMessage, ErrorSeverity, ErrorState, ErrorLine, ErrorProcedure)
values (@ErrorNumber, @ErrorMessage, @ErrorSeverity, @ErrorState, @ErrorLine, @ErrorProcedure);
return(1);
end
end
if (XACT_STATE() = 1)
begin
rollback transaction myTransaction;
if (object_id('tempdb..
insert
values (@ErrorNumber, @ErrorMessage, @ErrorSeverity, @ErrorState, @ErrorLine, @ErrorProcedure);
else
raiserror(@ErrorMessage, @ErrorSeverity, @ErrorState);
return(2);
end
else if (XACT_STATE() = -1)
begin
rollback transaction;
if (object_id('tempdb..
insert
values (@ErrorNumber, @ErrorMessage, @ErrorSeverity, @ErrorState, @ErrorLine, @ErrorProcedure);
else
raiserror(@ErrorMessage, @ErrorSeverity, @ErrorState);
return(3);
end
end catch
end
RAISERROR
ในความเป็นจริงจะยุติการดำเนินการหากตั้งค่าความรุนแรงเป็น 17 หรือ 18 แทนที่จะเป็น 16