概要
- ruby 3.2
rescue
した後にエラーになってもensure
は必ず実行されることを初めて知ったのでメモ。
サンプル
|
|
上記を実行すると以下のように出力される
hoge
rescue
hoge error
ensure
RuntimeError: ensure error
from (pry):20:in `ensure in hoge'
Caused by RuntimeError: rescue error
from (pry):17:in `rescue in hoge'
Caused by RuntimeError: hoge error
from (pry):14:in `hoge'
3回エラーが発生していてrescue
の中でエラーになっても処理が継続していた。ensure
でのエラーはどうしようもないのでputs 'finish'
は出力されていない。
例外処理ではそもそもエラーが起こり得るコードを書くべきではないけど、開発中にタイポしててこんな感じになった。
ドキュメントに以下の記載があった。
ensure 節が存在する時は begin 式を終了する直前に必ず ensure 節の本体を評価します。
「必ず」というのはensure
より前で何があっても(resucue
でエラーになってても)ということらしい。
単にミスしてただけだが、思わぬところで仕様を学んだ。