エラーがシグナルされたとき、signal
はそのエラーにたいするアクティブなハンドラー(handler)を検索します。ハンドラーとは、Lispプログラムの一部でエラーが発生したときに実行するよう意図されたLisp式のシーケンスです。そのエラーが適切なハンドラーをもっていればそのハンドラーが実行され、そのハンドラーの後から実行が再開されます。ハンドラーはそのハンドラーが設定されたcondition-case
の環境内で実行されます。condition-case
内のすべての関数呼び出しはすでに終了しているので、ハンドラーがそれらにリターンすることはありません。
そのエラーにたいする適切なハンドラーが存在しなければ、カレントコマンドを終了してエディターのコマンドループに制御をリターンします(コマンドループにはすべての種類のエラーにたいする暗黙のハンドラーがある)。コマンドループのハンドラーは、エラーメッセージをプリントするためにエラーシンボルと、それに関連付けられたデータを使用します。変数command-error-function
を使用して、これが行なわれる方法を制御できます:
この変数が非nil
なら、それはEmacsのコマンドループに制御をリターンしたエラーの処理に使用する関数を指定する。この関数は3つの引数を受け取る。1つ目のdataは、condition-case
が自身の変数にバインドするのと同じフォーム。2つ目のcontextはエラーが発生した状況を記述する文字列か、(大抵は)nil
。3つ目のcallerはエラーをシグナルしたプリミティブ関数を呼び出したLisp関数。
明示的なハンドラーがないエラーは、Lispデバッガーを呼び出すかもしれません(デバッガの呼び出しを参照)。変数debug-on-error
(エラーによるデバッガへのエンターを参照)が非nil
ならデバッガーが有効です。エラーハンドラーと異なり、デバッガーはそのエラーの環境内で実行されるので、エラー時の変数の値を正確に調べることができます。バッチモード(batchモードを参照)の場合には、Emacsプロセスは非0のexitステータスとともに通常どおりexitします。