RAISERROR 抛出的错误未进入 CATCH 块

标签: raiserror 错误 catch | 发表时间:2012-07-15 21:35 | 作者:niniu
出处:http://blog.csdn.net

今天写了一个储存过程,希望当出错时通过 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)即可解决。
作者:niniu 发表于2012-7-15 21:35:12 原文链接
阅读:11 评论:0 查看评论

相关 [raiserror 错误 catch] 推荐:

RAISERROR 抛出的错误未进入 CATCH 块

- - CSDN博客推荐文章
今天写了一个储存过程,希望当出错时通过 RAISERROR 抛出错误进入 CATCH 块,代码如下:. print 'exptype=' + coalesce(@exptype, '不存在'). raiserror('该导出不存在或者已经被撤销了', 10, 1). raiserror('尚未实现该功能', 10, 1).

try、catch、finally巧遇return

- - CSDN博客编程语言推荐文章
         Java的基本理念是“结构不佳的代码不能运行”--Thinking in Java.          Java中的异常处理是一种在编译阶段的错误报告机制,是通过编译器强制执行的. 是:编译期间并不能找出所有的错误,余下的问题必须在运行期间解决.          简单的来说,异常处理目的在于通过少量的代码是你的程序更加可靠.

try-catch-finally中的4个大坑,不小心就栽进去了!

- - 掘金 后端
在 Java 语言中 try-catch-finally 看似简单,一副人畜无害的样子,但想要真正的“掌控”它,却并不是一件容易的事. 别的不说,咱就拿 fianlly 来说吧,别看它的功能单一,但使用起来却“暗藏杀机”,若您不信,咱来看下面的这几个例子.... 坑1:finally中使用return.

Oracle错误代码

- - 数据库 - ITeye博客
ORA-00001: 违反唯一约束条件 (.). ORA-00017: 请求会话以设置跟踪事件. ORA-00018: 超出最大会话数. ORA-00019: 超出最大会话许可数. ORA-00020: 超出最大进程数 (). ORA-00021: 会话附属于其它某些进程;无法转换会话. ORA-00022: 无效的会话 ID;访问被拒绝.

10大经典错误

- beralee - 酷壳 - CoolShell.cn
下面是10、11个经典的错误,升序排名. 10、DOS的Abort,Retry, Fail. 85年以后出生的人可能不知道DOS是什么了,只有那老家伙还知道这是什么. 我还记得当时的我对于Abort和Fail这两个选择还是比较清楚的,不过,今天完全忘记了Abort和Fail的差别是什么. 这个出是DOS下的经常出现,也相当的经典,以至于在Wikepedia上都有专门的业面 Abort, Retry, Fail?.

Google Realtime出现404错误

- lube - Solidot
hidenosense 写道 "我的Google搜索页面左边工具栏里的realtime没了. 直接打开http://www.google.com/realtime返回404.

StackOverflow的404错误页

- yboren - 酷壳 - CoolShell.cn
不知道大家有没有注意到StakeOverflow的404错误页面. 这个是一个很有意思的图片,不知道你看懂了吗. 看上去像Python,又像 Ruby,还像 Perl,当然也有 C的影子,还有Brainfuck. 是的,这是一个杂交程序,杂交了Python,Ruby,Perl,C,还有Brainfuck(注意其中的#号),所有的语句都是输出“404”字符串.

预防错误的设计

- - Juven Xu
上周参加了一个 Michael Feathers 的 workshop,整个 workshop 内容非常多,其中大部分是围绕他那本著名的 《修改代码的艺术》所阐述,不过除此之外 Michael 还以  Beyond Error Handling, Using Design to Prevent Errors 为主题,讲了不少如何优雅地处理错误的做法和思路.

Spring MVC的常见错误

- - Java译站
10年前我开始自己的职业生涯的时候,Struts还是市场上的主流标准. 然而多年过后,我发现Spring MVC已经越来越流行了. 对我而言这并不意外,因为它能和Spring容器无缝集成,同时它还提供了灵活性及扩展性. 从我迄今为止对Spring的经验来看,我发现有不少人在配置Spring的时候经常会犯一些常见的错误.

locale错误导致Java中文乱码错误的总结

- - Java - 编程语言 - ITeye博客
线上执行MapReduce任务计算时,经过排查发现了某些服务器计算的数据出现中文乱码问题,但是服务器的配置是完全一致的. 由于我们使用的key可能包含中文,中文乱码问题体现在每次合并map记录的时候计算数据的随机性,每次执行的结果都不一样(由于Map任务执分配的随机性). (注:此文章大部分都参考了同事查找到的问题解决方法.