|
前
-
コピー
-
次
-
目次
後始末を忘れずに(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の方を先に書かなくてはいけない. 前 - コピー - 次 - 目次 |