Ruby Users' Guide - 後始末を忘れずに(ensure)

前 - コピー - 次 - 目次

### 後始末を忘れずに(ensure)

後処理が必要な場合というのはあるものだ．例えば，オープンした ファイルをクローズしたり，メモリの中のデータを書き出したりな どがあげられる．メソッドの出口がひとつならそこで後処理を行え ば良いことだが，いろいろな条件でreturnすることなど考えると， なかなかそうもいかない．更にrubyには例外があるので，話はやや こしくなってしまう．例えば，

     ruby> begin
     ruby|   file = open("/tmp/some_file", "w")
     ruby|   # なにかの処理
     ruby|   file.close
     ruby| end

このような例で，「なにかの処理」の間に例外が発生したら，file はcloseされずに残ってしまう．この場合，必ずfileはcloseして欲 しい．とはいえ，

     ruby> begin
     ruby|   file = open("/tmp/some_file", "w")
     ruby|   # なにかの処理
     ruby|   file.close
     ruby| rescue
     ruby|   file.close
     ruby|   fail # 例外の再発生
     ruby| end

というのもなにか複雑だし，これでは例外には対応できるが， returnやbreakで抜ける時にはまた個別に対応しないといけない． returnする場合毎にいちいちfileをcloseするというのも面倒な話 だ．

そういう場合のためにrubyには後処理を記述する構文がある． beginにensure節を指定すると，その部分beginから抜ける時に必ず 実行される．

     ruby> begin
     ruby|   file = open("/tmp/some_file", "w")
     ruby|   # なにかの処理
     ruby| ensure
     ruby|   file.close
     ruby| end

これでbeginを抜ける直前にかならずensureで指定された部分が実 行されるので，fileのcloseし忘れからのエラーを心配する必要は なくなる．ついでだが，ひとつのbeginにrescueとensureの両方を 指定する時はrescueの方を先に書かなくてはいけない．

前 - コピー - 次 - 目次