gpt4 book ai didi

ruby - `raise "foo "` and ` raise Exception.new ("foo")` 有什么区别?

转载 作者:数据小太阳 更新时间:2023-10-29 06:18:09 31 4
gpt4 key购买 nike

在技术、哲学、概念或其他方面有什么区别

raise "foo"

raise Exception.new("foo")

?

最佳答案

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

实际上,使用前者和使用后者之间存在显着差异。

简单地说,您可能想要一个 RuntimeError不是Exception .没有参数的救援 block 将捕获 RuntimeErrors , 但不会捕获 Exception秒。所以如果你提出 Exception在您的代码中,此代码不会捕获它:

begin
rescue
end

为了 catch Exception你必须这样做:

begin
rescue Exception
end

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

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

再一次,如果你正在编写库代码,你可能需要一个 RuntimeError ,不是 Exception ,因为如果它引发空白 rescue 的错误,您的图书馆的用户会感到惊讶。 block 无法捕获,他们需要一些时间才能意识到原因。

最后,我要说的是 RuntimeErrorStandardError 的子类类,实际规则是虽然你可以 raise 任何 类型的对象,空白 rescue默认情况下只会捕获从 StandardError 继承的任何内容.其他一切都必须具体。

关于ruby - `raise "foo "` and ` raise Exception.new ("foo")` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4800698/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com