Ruby的“加注”会修改异常吗?
或者,正在关注片段:
some_method(MyException.new)
和
begin
raise MyException.new
rescue MyException => e
some_method(e)
end
等效?如果没有,有什么区别?
答案 0 :(得分:1)
不,它们不相同。
begin e = Exception.new "AAA" puts e.backtrace.nil? raise e rescue Exception => e puts e.backtrace.nil? end
给出
true false
有谁知道其他差异?
修改强>
Kernel#raise
除非调用raise
而没有参数并且定义了$!
,否则不会修改异常(这意味着:除了在rescue
子句中重新引发异常而没有参数)。在以下示例中:
begin raise "exception" #1 rescue raise #2 end
异常将在#1加注中被修改(其上下文和回溯改变),但在#2加注时未被触及。它将在任何其他情况下进行修改,包括使用某些参数重新引发异常,例如:
begin raise "exception" #1 rescue Exception => e raise e #2 end
此处异常将在#1和#2中更改。
有关详细信息,请参阅https://github.com/rubinius/rubinius/blob/master/kernel/delta/kernel.rb。
以上适用于Rubinius。它在MRI 1.9和JRuby中应该是相同的,但我还没有检查过它。