Ruby “加薪”与“加薪”有什么区别;“福”和“raiseexception.new”(“foo”)`?

Ruby “加薪”与“加薪”有什么区别;“福”和“raiseexception.new”(“foo”)`?,ruby,exception,exception-handling,Ruby,Exception,Exception Handling,技术、哲学、概念或其他方面的区别是什么 raise "foo" 及 ? 如果没有参数,则在$中引发异常任何类型的对象,但空白救援< /代码>将默认只捕获继承自 StRealDror < /C>的任何东西。其他一切都必须具体。非常有用,谢谢。有几件事:[1]最后一段是最具启发性的,让我在irb上发现一些你没有提到的东西:RuntimeError

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

raise "foo"

如果没有参数,则在
$中引发异常$,则会引发
运行时错误
为零。使用单个
String
参数,它会将字符串作为消息引发
RuntimeError
。否则,第一个参数应该是
异常
类(或发送异常时返回
异常
的对象)的名称。可选的第二个参数设置与异常关联的消息,第三个参数是回调信息数组。异常被
begin…end
块的rescue子句捕获

raise "Failed to create socket"
raise ArgumentError, "No parameters", caller

从技术上讲,第一个引发运行时错误,消息设置为
“foo”
,第二个引发异常,消息设置为
“foo”

实际上,您希望使用前者的时间与希望使用后者的时间之间存在显著差异

简单地说,您可能希望出现
运行时错误
而不是
异常
。没有参数的rescue块将捕获
运行时错误
,但不会捕获
异常
s。因此,如果在代码中引发
异常
,则此代码将无法捕获它:

begin
rescue
end
要捕获
异常
,您必须执行以下操作:

begin
rescue Exception
end
这意味着在某种意义上,
异常
是比
运行时错误
更“糟糕”的错误,因为您必须做更多的工作才能从中恢复

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

同样,如果您正在编写库代码,您可能希望出现
运行时错误
,而不是
异常
,因为如果出现空白
rescue
块无法捕捉到的错误,库的用户会感到惊讶,他们需要一段时间才能意识到原因


<>最后,我应该说<代码> RunTimeRebug 是SturalDror 类的子类,而实际的规则是,尽管您可以<代码>抬起< /Cord>任何类型的对象,但空白<代码>救援< /代码>将默认只捕获继承自<代码> StRealDror < /C>的任何东西。其他一切都必须具体。

非常有用,谢谢。有几件事:[1]最后一段是最具启发性的,让我在irb上发现一些你没有提到的东西:
RuntimeError
[2]因此,第二段代码将捕获异常和RuntimeError[3]很有趣/奇怪的是“裸”raise和rescue恰好与该特定异常一起工作[4]也许经验法则是将RuntimeError提升到客户机代码中,但在自己的代码中提升和拯救自己的自定义异常?[1,2]是的。[3] 不确定。。。[4] 当我以最专业的方式编写代码时,我倾向于创建从
standarderro
继承的自定义错误类型。它不必比几行更复杂,比如
class MissingArgumentsError
。信息非常丰富,但在何种情况下,如果首选运行时错误来编写libraray,您会希望抛出异常而不是运行时错误?
begin
rescue
end
begin
rescue Exception
end