首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >` `raise "foo"`和` `raise Exception.new("foo")`有什么区别?

` `raise "foo"`和` `raise Exception.new("foo")`有什么区别?
EN

Stack Overflow用户
提问于 2011-01-26 09:40:39
回答 2查看 52.3K关注 0票数 105

技术、哲学、概念或其他方面的区别是什么?

代码语言:javascript
复制
raise "foo"

代码语言:javascript
复制
raise Exception.new("foo")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-26 18:29:05

从技术上讲,第一个方法引发一个消息设置为"foo"的RuntimeError,第二个方法引发一个消息设置为"foo"的异常。

实际上,什么时候你想使用前者,什么时候你想使用后者,两者之间有很大的区别。

简单地说,您可能需要RuntimeError而不是Exception。不带参数的救援块将捕获RuntimeErrors,但不会捕获Exception%s。因此,如果您在代码中引发Exception,此代码将不会捕获它:

代码语言:javascript
复制
begin
rescue
end

为了捕获Exception,您必须执行以下操作:

代码语言:javascript
复制
begin
rescue Exception
end

这意味着在某种意义上,ExceptionRuntimeError是一个“更糟糕”的错误,因为您必须做更多的工作才能从中恢复。

所以你想要哪一个取决于你的项目如何做它的错误处理。例如,在我们的守护进程中,主循环有一个空白的救援,它将捕获RuntimeErrors,报告它们,然后继续。但在一两种情况下,我们希望守护进程真的死于错误,在这种情况下,我们引发一个Exception,它直接通过我们的“正常错误处理代码”并输出。

同样,如果您正在编写库代码,您可能需要一个RuntimeError,而不是一个Exception,因为如果您的库的用户会惊讶于它引发了空白rescue块无法捕获的错误,并需要一段时间才能意识到其中的原因。

最后,我应该说RuntimeErrorStandardError类的子类,而实际的规则是,尽管您可以raise任何类型的对象,但空白rescue在默认情况下将只捕获从StandardError继承的任何内容。其他的一切都必须具体。

票数 125
EN

Stack Overflow用户

发布于 2011-01-26 09:46:57

From the offical documentation:

代码语言:javascript
复制
raise   
raise( string )
raise( exception [, string [, array ] ] )

在没有参数的情况下,在$!中引发异常,或者如果$!为空则引发RuntimeError。只需一个String参数,它就会引发一个包含字符串作为消息的RuntimeError。否则,第一个参数应该是Exception类的名称(或发送异常时返回Exception的对象)。可选的第二个参数设置与异常关联的消息,第三个参数是一个回调信息数组。异常由begin...end块的救援子句捕获。

代码语言:javascript
复制
raise "Failed to create socket"
raise ArgumentError, "No parameters", caller
票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4800698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档