[Ruby] begin ~ rescue ~ else ~ ensureの罠

以下のコードの出力結果を答えなさい


環境: ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin14]

#!/usr/bin/env ruby
def my_method(obj)
return if obj.nil?
raise 'error' if obj == 1
rescue => e
print "1"
else
print "2"
ensure
print "3\n"
end

Q1: my_method(1) の結果を答えよ


Q2: my_method(2) の結果を答えよ


Q3: my_method(nil) の結果を答えよ


正解は...


Q1: 13
Q2: 23
Q3: 3

begin ~ rescue ~ else ~ ensure 中でreturn すると elseは実行されない!


foo_method(nil)を呼び出すと return if obj.nil?が実行されるので
elseが実行後にensureが実行されると思われがちです


しかしelseの部分は実行されずにensureのみが実行されます
そのため結果は23 ではなく 3になります


begin ~ rescue ~ else ~ ensurebegin 内部で 明示的に return してしまうと

elseが呼ばれません


例外が起きた場合は 失敗メールを送る, 例外が起きなかった場合は 成功メールを送る


上記のようなケースで begin ~ rescue ~ else ~ ensure を利用している場合は注意しましょう!
途中でreturn している場合に 成功メールが飛ばない場合がありますよ!


それなりの期間ruby触っていますが、ようやく気づいた仕様ですOTL

関連記事
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。