読者です 読者をやめる 読者になる 読者になる

Emacs Lispで例外処理

emacs elisp

direx.elでgitプロジェクトのディレクトリツリーを表示する、またはdirex-project.elの紹介 - $shibayu36->blog;


Emacs Lispというか Lisp系の言語はエラー処理が豊富です。
私もよくわかっていない部分もあるので問題があればお知らせください。

ignore-errors

エラーが発生したことだけ検知したいのであれば ignore-errorsで
事足りるのではないでしょうか。ingore-errorsはエラーが返ると
そのブロックからは nilが返るというものです。

(let ((result (ignore-errors
                (do-something)
                t)))
  (unless result
    (do-failed-case)))

do-somethingerrorが発生すると、エラーの発生を抑制し、 resultが nil
なります。成功するとそのままブロックの処理を続け tとなります。あとは
その結果に応じて失敗時の処理を行えば良いわけです。

condition-case

ignore-errorsは単にエラーを無視する側面もありますが、condition-caseは
エラー処理専用の構文です。

(condition-case err-var
    (progn
      (error "Failed"))
  (error "Error: %s" err-var))

第一引数がエラーが格納される変数名、第二引数が body、第三引数以降が
エラーハンドラです。第三引数の errorっていうのは error関数ではなく、
エラーの種類です。他に arith-error等あります。詳しくはドキュメントを
参照してください。errorというのはすべて補足するものです。


try-catch的なものを利用したい場合は、構文的にもこちらの方が
いいかもしれません。

unwind-protect

try-catch-finallyの finallyを扱いときに使うものです。成功しても
失敗しても実行したい処理がある場合に利用できます。上記の示した
フォームと組み合わせて try-catch-finallyを実現できます。

(ignore-errors
  (unwind-protect
      (progn
        (error "hoge"))
    (message "This code is must executed!!")))

unwind-protectの第一引数の bodyが失敗しても成功しても、
messageの部分が利用されます。ファイルを deleteするとか
終了処理を入れることが多いでしょうか。


他にもあると思いますが、このへんを知っておけばだいたい
なんとかなります。


Enjoy hacking Emacs Lisp!!