Next: Infinite Loops, Previous: Debugger, Up: 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)))