確実に後処理を行なう - lisp-cookbook-ja/common-lisp GitHub Wiki

例外処理 制御構造 マクロ

確実に後処理を行なう

ファイルを開いた場合やネットワークに接続した場合、例外が発生した場合でもその後処理を確実に行ないたいことがあります。そのような場合、 unwind-protect を使い例外が発生しても後処理を確実に行なうようにします。

(let ((in (open "foo.txt")) 
      (delete? t))                        ;後処理確認のためのフラグ
  (unwind-protect 
       (multiple-value-prog1 
           (progn 
             (job1)
             (job2)
             (job3)) 
         (setq delete? nil))              ;無事に辿り着いたらフラグをnilに
    (when in
      (close in :abort delete?))))        ;delete? => T ならば
                                          ; close が後処理をする

この一連の流れは定型となっていて標準のマクロ with-open-file 等も内部で unwind-protect を利用しています。

上記は、 with-open-file を利用すると下記のように書けます。

(with-open-file (in "foo.txt")
  (job1)
  (job2)
  (job3))