1

Ruby の "raise" は例外を変更しますか?

または、次のスニペットです:

some_method(MyException.new)

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

同等?そうでない場合、違いは何ですか?

4

1 に答える 1

1

いいえ、それらは同等ではありません。

始める
  e = Exception.new "AAA"
  put e.backtrace.nil?
  eを上げる
レスキュー例外 => e
  put e.backtrace.nil?
終わり

与える

真実
間違い

他の違いを知っている人はいますか?

編集:

Kernel#raiseraiseがパラメーターなしで呼び出され、定義されていない限り、例外を変更しません$!(つまりrescue、パラメーターなしの句で例外を再発生させる場合を除く)。次の例では:

始める
  「例外」を発生させる #1
救援
  #2を上げる
終わり

#1 のレイズでは例外が変更されますが (そのコンテキストとバックトレースが変更されます)、#2 のレイズでは変更されません。それ以外の場合は、次のようなパラメーターで例外を再発生させるなど、変更されます。

始める
  「例外」を発生させる #1
レスキュー例外 => e
  e #2を上げる
終わり

ここで、#1 と #2 の両方で例外が変更されます。

詳細については、 https://github.com/rubinius/rubinius/blob/master/kernel/delta/kernel.rbを参照してください。

上記はルビニウスに適用されます。MRI 1.9 と JRuby では同じはずですが、確認していません。

于 2012-12-06T18:03:18.867 に答える