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を適当な処理に変えてみましたが例外は補足できました。
現実的に、意図せず例外を潰したソースコードは結構あるのかも知れませんね。