RAISERROR 抛出的错误未进入 CATCH 块
- - CSDN博客推荐文章今天写了一个储存过程,希望当出错时通过 RAISERROR 抛出错误进入 CATCH 块,代码如下:. print 'exptype=' + coalesce(@exptype, '不存在'). raiserror('该导出不存在或者已经被撤销了', 10, 1). raiserror('尚未实现该功能', 10, 1).
今天写了一个储存过程,希望当出错时通过 RAISERROR 抛出错误进入 CATCH 块,代码如下:
create procedure dbo.mp_CancelKHExport @ExpUID CHAR(16), @UserName VARCHAR(30), @Result BIT OUTPUT, @ErrMsg NVARCHAR(250) OUTPUT as begin declare @trancount int select @trancount=@@TRANCOUNT, @Result=0, @ErrMsg='' BEGIN TRY BEGIN TRAN declare @ExpType VARCHAR(50) select @ExpType=ExportType from XHExportInfo where UID=@ExpUID and Active=1 print 'exptype=' + coalesce(@exptype, '不存在') if @ExpType='StampP' exec dbo.mp_CancelStampP @ExpUID, @Result output, @ErrMsg output else if @ExpType is null raiserror('该导出不存在或者已经被撤销了', 10, 1) else raiserror('尚未实现该功能', 10, 1) update XHExportInfo set Active=0, Remark=dbo.mfn_FormatDateTime(getdate(), 'Y-M-D H:N:S') + ' 被 ' + @UserName + ' 撤销' where UID=@ExpUID COMMIT TRAN select @Result=1, @ErrMsg='--' END TRY BEGIN CATCH if @@TRANCOUNT>@trancount ROLLBACK TRAN select @Result=0, @ErrMsg=ERROR_MESSAGE() END CATCH end
else if @ExpType is null raiserror('该导出不存在或者已经被撤销了', 10, 1)执行 raiserror('该导出不存在或者已经被撤销了', 11, 1) 之后,并没有跳转到 BEGIN CATCH 块中,而是继续执行了 select @Result=1, @ErrMsg='--',并且,RAISERROR 所抛出的错误还输出到控制台查询 MSDN 发现,有这样一段说明:如果在 TRY...CATCH 构造的 TRY 块中执行的 RAISERROR 严重度介于 11 到 19 之间,会导致将控制传递到关联的 CATCH 块。如果指定 10 或更低的严重度,将使用 RAISERROR 返回消息,而不调用 CATCH 块。PRINT 不会将控制传输到 CATCH 块。原因就是严重程度小于11,将其改为RAISERROR('该导出不存在或者已经被撤销了', 11, 1)即可解决。