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