Lispプログラムがエラーを通知すると、関数 signal が呼び出され、エラーに対する有効な
ハンドラ
が検索されます。ハンドラとは、Lispプログラムの一部でエラーが発生した際に実行されるよう指定されたLisp式のシーケンスのことです。エラーに適用可能なハンドラが存在する場合、そのハンドラが実行され、制御はハンドラの続きから再開されます。ハンドラは、それを設定した
condition-case の環境で実行されます。その condition-case
内で呼び出されたすべての関数はすでに終了しており、ハンドラがそれらに戻ることはできません。
エラーに対応するハンドラが存在しない場合、現在のコマンドを終了し、保留中の未処理の入力イベント(入力イベントを参照)をすべてフラッシュし11、制御をエディタのコマンドループに戻します。(コマンドループには、あらゆる種類のエラーに対する暗黙的なハンドラが備わっています。)その後、コマンドループのハンドラがエラーシンボルと関連データを使用してエラーメッセージを出力します。この動作を制御するには、変数
command-error-function を使用できます:
この変数が nil 以外の場合、Emacs
のコマンドループに制御を戻すエラーを処理するために使用する関数を指定します。この関数は3つの引数を取る必要があります。data(condition-case
がその変数にバインドするのと同じ形式のリスト)、context(エラーが発生した状況を説明する文字列、または(より一般的には)nil)、および caller(エラーを通知したプリミティブを呼び出した Lisp 関数)です。
明示的なハンドラを持たないエラーが発生すると、Lispデバッガが呼び出されることがあります(デバッガの呼び出しを参照)。変数 debug-on-error(エラー発生時のデバッガへの進入を参照)が nil
以外の場合、デバッガが有効になります。エラーハンドラとは異なり、デバッガはエラーが発生した環境内で動作するため、エラー発生時の変数の値をそのまま確認することができます。バッチモード(バッチモードを参照)では、通常、Emacsプロセスは非ゼロの終了ステータスで終了します。
保留中の入力は、ユーザーがエラーなく実行が進むと想定してあらかじめ何らかの文字を入力していた可能性があるため、破棄されます。これらの入力イベントを保持すると、無関係なバッファに不要な文字が挿入されたり、意図しないコマンドが実行されたりするなど、予期せぬ結果を招く恐れがあります。