Ruby の "raise" は例外を変更しますか?
または、次のスニペットです:
some_method(MyException.new)
と
begin
raise MyException.new
rescue MyException => e
some_method(e)
end
同等?そうでない場合、違いは何ですか?
いいえ、それらは同等ではありません。
始める e = Exception.new "AAA" put e.backtrace.nil? eを上げる レスキュー例外 => e put e.backtrace.nil? 終わり
与える
真実 間違い
他の違いを知っている人はいますか?
編集:
Kernel#raise
raise
がパラメーターなしで呼び出され、定義されていない限り、例外を変更しません$!
(つまり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 では同じはずですが、確認していません。