次: Infinite Loops, 前: Debugger, 上: Debugger
デバッガへ入るもっとも重要な時期は、Lispエラーが発生したときです。 これにより、エラーの直接原因を調べることができます。
しかし、デバッガに入るのは、エラーの通常の帰結ではありません。
多くのコマンドは
(バッファの末尾でC-fを使うなどの)不適切に起動されると
しばしばLispエラーを生じますが、
通常の編集ではそのたびにデバッガに入ったのではとても不便です。
そのため、エラーによってデバッガに入りたい場合には、
変数debug-on-errorにnil以外を設定します。
(コマンドtoggle-debug-on-errorはこれを簡単に行う。)
この変数は、エラーが通知され処理されないときに デバッガを呼び出すかどうか決定する。
debug-on-errorがtであると、 すべての種類のエラー(debug-ignored-errorsに指定したものを除く) はデバッガを呼び出す。nilであるとデバッガを呼び出さない。その値はデバッガを呼び出すエラー条件のリストでもよい。 たとえば、リスト
(void-variable)にすると、 「値を持たない変数に関したエラー」のみがデバッガを起動する。この変数が
nil以外であると、 Emacsはプロセスのフィルタ関数や番兵に対してエラーハンドラを作成しない。 したがって、これらの関数でのエラーもデバッガを起動する。 see Processes。
この変数は、デバッガに入らないエラーの種類を指定する。 その値はエラー条件シンボルや正規表現のリストである。 エラーにこれらの条件シンボルが含まれるか エラーメッセージが正規表現の1つに一致する場合には、
debug-on-errorの値に関わらず 当該エラーではデバッガに入らない。この変数の通常の値は、 編集ではしばしば発生するが、Lispプログラムのバグではほとんど発生しないような エラー群のリストである。 しかし、『ほとんど』は『けっして』ではない。 このリストに一致するようなエラーで読者のプログラムが失敗する場合、 エラーをデバッグするにはこのリストを変更する必要がある。 もっとも簡単な方法は、
debug-ignored-errorsにnilを 設定することである。
通常、
condition-caseで捕捉したエラーは、 たとえdebug-on-errorがnil以外であっても、 けっしてデバッガを起動しない。 いいかえれば、デバッガを起動するまえに、condition-caseはエラー処理の機会を得るのである。
debug-on-signalにnil以外の値を設定すると、 各エラーごとにデバッガがまず機会を得る。debug-on-errorとdebug-ignored-errorsの値で指定される 条件に一致すれば、condition-caseに関わらず エラーはデバッガを起動する。警告: この変数は強力な処方である! Emacsのさまざまな部分では通常の動作としてエラーを処理し、 読者にはエラーが発生したことさえわからない。
debug-on-signalにnil以外の値を設定すると それらのエラーでデバッガに入る。警告:
debug-on-errorがnilであると、debug-on-signalは意味を持たない。
ファイル.emacsをロード中に発生するエラーをデバッグするには、
オプション`--debug-init'を使います。
これにより、.emacsのロード中はdebug-on-errorをtに束縛し、
初期化ファイルでのエラーを捕捉するcondition-caseを迂回します。
読者のファイル.emacsでdebug-on-errorを設定しても、
その効果は.emacsのロードを終ると持続しません。
(これはコマンド行オプション`--debug-init'の実装における
好ましくない特性である。)
.emacsでdebug-on-errorを恒久的に設定する最良の方法は、
つぎのように、after-init-hookを用いることです。
(add-hook 'after-init-hook
'(lambda () (setq debug-on-error t)))