1

Ruby 的“引发”是否修改异常?

或者,是以下片段:

some_method(MyException.new)

begin
  raise MyException.new
rescue MyException => e
  some_method(e)
end

相等的?如果不是,有什么区别?

4

1 回答 1

1

不,它们不相等。

开始
  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.

于 2012-12-06T18:03:18.867 回答