两者之间有什么区别 - 技术、哲学、概念或其他方面
raise "foo"
and
raise Exception.new("foo")
?
从技术上讲,第一个会引发 RuntimeError,消息设置为"foo"
,第二个引发异常,消息设置为"foo"
.
实际上,何时使用前者和何时使用后者之间存在显着差异。
简而言之,您可能想要一个RuntimeError
not an Exception
。没有参数的救援块会捕获RuntimeErrors
,但不会抓住Exception
s。所以如果你提出Exception
在您的代码中,此代码不会捕获它:
begin
rescue
end
为了抓住Exception
你必须这样做:
begin
rescue Exception
end
这意味着从某种意义上来说,Exception
是一个比“更糟糕”的错误RuntimeError
,因为你必须做更多的工作才能从中恢复。
因此,您想要哪个取决于您的项目如何进行错误处理。例如,在我们的守护进程中,主循环有一个空白救援,它将捕获RuntimeErrors
,报告它们,然后继续。但在一两种情况下,我们希望守护进程真的因错误而死亡,在这种情况下,我们会提出一个Exception
,它直接通过我们的“正常错误处理代码”并输出。
再说一遍,如果您正在编写库代码,您可能需要一个RuntimeError
,不是一个Exception
,因为如果您的库的用户出现空白的错误,将会感到惊讶rescue
块无法捕获,他们需要一些时间才能意识到原因。
最后,我应该说的是RuntimeError
是一个子类StandardError
类,实际规则是,虽然你可以raise
any对象类型,空白rescue
默认情况下只会捕获继承自的任何内容StandardError
。其他一切都必须具体。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)