ensure句におけるreturnの問題

前回エントリーした「finally句におけるreturnの問題」についてrubyの場合はどうなるのか検証してみました。javaにおけるtry-catch-finallyは、rubyでのbegin-rescure-ensureと同じだと思っています。

def method
  puts "3: method start"
  begin
    raise Exception if true
  rescue Exception => e
    raise e
  ensure
    #return
  end
  puts "4: method end"
end

puts "1: proc start"
begin
  puts "2: proc method call"
  method
  puts "5: proc method called"
rescue Exception => e
  puts "6: proc catch:" + e
end
puts "7: proc end"

結果、

1: proc start
2: proc method call
3: method start
6: proc catch:Exception
7: proc end

呼び出し元procにおいて例外を補足しています。
今度は、上記ソースのensureの中でreturnを記述してみます。

1: proc start
2: proc method call
3: method start
5: proc method called
7: proc end

やはりjavaと同じ結果で例外がreturnによって握りつぶされるようです。
rubyの仕様ではメソッドの最終処理がreturn値となるようなので、試しにensureのreturnを適当な処理に変えてみましたが例外は補足できました。
現実的に、意図せず例外を潰したソースコードは結構あるのかも知れませんね。