Ruby 的“引发”是否修改异常?
或者,是以下片段:
some_method(MyException.new)
和
begin
raise MyException.new
rescue MyException => e
some_method(e)
end
相等的?如果不是,有什么区别?
不,它们不相等。
开始 e = Exception.new "AAA" 把e.backtrace.nil? 提高e 救援异常 => e 把e.backtrace.nil? 结尾
给
真的 错误的
有谁知道其他区别?
编辑:
Kernel#raise
不会修改异常,除非raise
在没有参数的情况下调用并定义(这意味着:除了在没有参数的子句中$!
重新引发异常)。rescue
在以下示例中:
开始 提出“异常”#1 救援 提高#2 结尾
异常将在 #1 raise 中被修改(其上下文和回溯已更改),但在 #2 raise 中保持不变。它将在任何其他情况下进行修改,包括使用一些参数重新引发异常,例如:
开始 提出“异常”#1 救援异常 => e 提高 e #2 结尾
这里的异常将在 #1 和 #2 中更改。
See https://github.com/rubinius/rubinius/blob/master/kernel/delta/kernel.rb for details.
Above applies to Rubinius. It should be the same in MRI 1.9 and JRuby, but I haven't checked it.