Next: エラーを処理するコードの記述, Previous: エラーをシグナルする方法, Up: エラー [Contents][Index]
エラーがシグナルされたとき、signal
はそのエラーにたいするアクティブなハンドラー(handler)を検索します。ハンドラーとは、Lispプログラムの一部でエラーが発生したときに実行するよう意図されたLisp式のシーケンスです。そのエラーが適切なハンドラーをもっていればそのハンドラーが実行され、そのハンドラーの後から実行が再開されます。ハンドラーはそのハンドラーが設定されたcondition-case
の環境内で実行されます。condition-case
内のすべての関数呼び出しはすでに終了しているので、ハンドラーがそれらにリターンすることはありません。
そのエラーにたいする適切なハンドラーが存在しなければ、カレントコマンドを終了してエディターのコマンドループに制御をリターンします(コマンドループにはすべての種類のエラーにたいする暗黙のハンドラーがある)。コマンドループのハンドラーは、エラーメッセージをプリントするためにエラーシンボルと、それに関連付けられたデータを使用します。変数command-error-function
を使用して、これが行なわれる方法を制御できます:
この変数が非nil
なら、それはEmacsのコマンドループに制御をリターンしたエラーの処理に使用する関数を指定する。この関数は3つの引数を受け取る。1つ目のdataは、condition-case
が自身の変数にバインドするのと同じフォーム。2つ目のcontextはエラーが発生した状況を記述する文字列か、(大抵は)nil
。3つ目のcallerはエラーをシグナルしたプリミティブ関数を呼び出したLisp関数。
An error that has no explicit handler may call the Lisp debugger
(see デバッガの呼び出し). The debugger is enabled if the variable
debug-on-error
(see エラーによるデバッガへのエンター) is non-nil
. Unlike
error handlers, the debugger runs in the environment of the error, so that
you can examine values of variables precisely as they were at the time of
the error. In batch mode (see batchモード), the Emacs process then
normally exits with a non-zero exit status.