Life is very short

2013-01-27

Emacs Lispで例外処理

| 21:50

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-somethingで errorが発生すると、エラーの発生を抑制し、 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!!

トラックバック - http://d.hatena.ne.jp/syohex/20130127/1359291030