Nếu bạn sử dụng khối thử / bắt, một số lỗi raiserror với mức độ nghiêm trọng 11-19 sẽ khiến việc thực thi chuyển sang khối bắt.
Bất kỳ mức độ nghiêm trọng nào trên 16 đều là lỗi hệ thống. Để chứng minh đoạn mã sau, hãy thiết lập một khối try / catch và thực thi một thủ tục đã lưu trữ mà chúng tôi cho rằng sẽ không thành công:
giả sử chúng ta có một bảng [dbo]. [Lỗi] giữ lỗi giả sử chúng ta có một thủ tục được lưu trữ [dbo]. [AssumeThisFails] sẽ không thành công khi chúng ta thực thi nó
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
trên thực tế sẽ chấm dứt thực thi nếu mức độ nghiêm trọng được đặt thành 17 hoặc 18, thay vì 16