RAISERROR 抛出的错误未进入 CATCH 块

来源:互联网 发布:mac中毒会有什么反应 编辑:程序博客网 时间:2024/06/07 08:36

今天写了一个储存过程,希望当出错时通过 RAISERROR 抛出错误进入 CATCH 块,代码如下:

create procedure dbo.mp_CancelKHExport@ExpUID CHAR(16),@UserName VARCHAR(30),@Result BIT OUTPUT,@ErrMsg NVARCHAR(250) OUTPUTasbegindeclare @trancount intselect @trancount=@@TRANCOUNT, @Result=0, @ErrMsg=''BEGIN TRYBEGIN TRANdeclare @ExpType VARCHAR(50)select @ExpType=ExportType from XHExportInfo where UID=@ExpUID and Active=1print 'exptype=' + coalesce(@exptype, '不存在')if @ExpType='StampP'exec dbo.mp_CancelStampP @ExpUID, @Result output, @ErrMsg outputelse if @ExpType is nullraiserror('该导出不存在或者已经被撤销了', 10, 1)elseraiserror('尚未实现该功能', 10, 1)update XHExportInfo set Active=0, Remark=dbo.mfn_FormatDateTime(getdate(), 'Y-M-D H:N:S') + ' 被 ' + @UserName + ' 撤销'where UID=@ExpUIDCOMMIT TRANselect @Result=1, @ErrMsg='--'END TRYBEGIN CATCHif @@TRANCOUNT>@trancountROLLBACK TRANselect @Result=0, @ErrMsg=ERROR_MESSAGE()END CATCHend

但是,测试时发现当执行到:

else if @ExpType is nullraiserror('该导出不存在或者已经被撤销了', 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)即可解决。