Next: , Previous: Debugger, Up: Debugger


17.1.1 エラーによるデバッガの起動

デバッガへ入るもっとも重要な時期は、Lispエラーが発生したときです。 これにより、エラーの直接原因を調べることができます。

しかし、デバッガに入るのは、エラーの通常の帰結ではありません。 多くのコマンドは (バッファの末尾でC-fを使うなどの)不適切に起動されると しばしばLispエラーを生じますが、 通常の編集ではそのたびにデバッガに入ったのではとても不便です。 そのため、エラーによってデバッガに入りたい場合には、 変数debug-on-errornil以外を設定します。 (コマンドtoggle-debug-on-errorはこれを簡単に行う。)

— User Option: debug-on-error

この変数は、エラーが通知され処理されないときに デバッガを呼び出すかどうか決定する。 debug-on-errortであると、 すべての種類のエラー(debug-ignored-errorsに指定したものを除く) はデバッガを呼び出す。 nilであるとデバッガを呼び出さない。

その値はデバッガを呼び出すエラー条件のリストでもよい。 たとえば、リスト(void-variable)にすると、 「値を持たない変数に関したエラー」のみがデバッガを起動する。

この変数がnil以外であると、 Emacsはプロセスのフィルタ関数や番兵に対してエラーハンドラを作成しない。 したがって、これらの関数でのエラーもデバッガを起動する。 see Processes

— User Option: debug-ignored-errors

この変数は、デバッガに入らないエラーの種類を指定する。 その値はエラー条件シンボルや正規表現のリストである。 エラーにこれらの条件シンボルが含まれるか エラーメッセージが正規表現の1つに一致する場合には、 debug-on-errorの値に関わらず 当該エラーではデバッガに入らない。

この変数の通常の値は、 編集ではしばしば発生するが、Lispプログラムのバグではほとんど発生しないような エラー群のリストである。 しかし、『ほとんど』は『けっして』ではない。 このリストに一致するようなエラーで読者のプログラムが失敗する場合、 エラーをデバッグするにはこのリストを変更する必要がある。 もっとも簡単な方法は、debug-ignored-errorsnilを 設定することである。

— User Option: debug-on-signal

通常、condition-caseで捕捉したエラーは、 たとえdebug-on-errornil以外であっても、 けっしてデバッガを起動しない。 いいかえれば、デバッガを起動するまえに、 condition-caseはエラー処理の機会を得るのである。

debug-on-signalnil以外の値を設定すると、 各エラーごとにデバッガがまず機会を得る。 debug-on-errordebug-ignored-errorsの値で指定される 条件に一致すれば、condition-caseに関わらず エラーはデバッガを起動する。

警告: この変数は強力な処方である! Emacsのさまざまな部分では通常の動作としてエラーを処理し、 読者にはエラーが発生したことさえわからない。 debug-on-signalnil以外の値を設定すると それらのエラーでデバッガに入る。

警告: debug-on-errornilであると、 debug-on-signalは意味を持たない。

ファイル.emacsをロード中に発生するエラーをデバッグするには、 オプション‘--debug-init’を使います。 これにより、.emacsのロード中はdebug-on-errortに束縛し、 初期化ファイルでのエラーを捕捉するcondition-caseを迂回します。

読者のファイル.emacsdebug-on-errorを設定しても、 その効果は.emacsのロードを終ると持続しません。 (これはコマンド行オプション‘--debug-init’の実装における 好ましくない特性である。) .emacsdebug-on-errorを恒久的に設定する最良の方法は、 つぎのように、after-init-hookを用いることです。

     (add-hook 'after-init-hook
               '(lambda () (setq debug-on-error t)))