Ruby的“加注”修改异常吗?

时间:2012-12-06 17:37:44

标签: ruby exception

Ruby的“加注”会修改异常吗?

或者,正在关注片段:

some_method(MyException.new)

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

等效?如果没有,有什么区别?

1 个答案:

答案 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中应该是相同的,但我还没有检查过它。