Next: Emacsがエラーを処理する方法, Up: エラー [Contents][Index]
エラーのシグナリング(signaling)とは、エラーの処理を開始することを意味します。エラー処理は通常は実行中のプログラムのすべて、または一部をアボート(abort)してエラーをハンドルするためにセットアップされた位置にリターンします。ここではエラーをシグナルする方法を記述します。
ほとんどのエラーは、たとえば整数にたいしてCARの取得を試みたり、バッファーの最後で1文字前方に移動したときなどのように、他の目的のために呼び出したLispプリミティブ関数の中で自動的にシグナルされます。関数error
とsignal
で明示的にエラーをシグナルすることもできます。
ユーザーがC-gをタイプしたときに発生するquitはエラーとは判断されませんが、ほとんどはエラーと同様に扱われます。quitを参照してください。
すべてのエラーメッセージはそれぞれ、何らかのエラーメッセージを指定します。そのメッセージはどうであるべきか(“File must exist”)ではなく、何が悪いのか(“File does not exist”)を示すべきです。Emacs Lispの慣習ではエラーメッセージは大文字で開始され、区切り文字で終わるべきではありません。
この関数はformat-stringとargsにたいして、format-message
(文字列のフォーマットを参照)を適用して構築されたエラーメッセージとともに、エラーをシグナルする。
以下はerror
を使用する典型的な例である:
(error "That is an error -- try something else") error→ That is an error -- try something else
(error "Invalid name `%s'" "A%%B") error→ Invalid name ‘A%%B’
2つの引数 — エラーシンボルerror
とformat-message
がリターンする文字列を含むリスト —
でsignal
を呼び出すことによりerror
は機能する。
"Missing `%s'"が"Missing ‘foo’"となるように、通常はフォーマット内のgrave accentとapostropheはマッチするcurved quotesに変換される。この変換の効果や抑制についてはテキストのクォートスタイルを参照のこと。
警告: エラーメッセージとして固定の文字列を使用したい場合、単に(error
string)
とは記述しないこと。もしstringが‘%’、‘`’、‘'’を含んでいると、再フォーマットされて望む結果は得られないだろう。かわりに、(error
"%s" string)
を使用すること。
この関数はnoninteractive
(batchモードを参照)が非nil
の場合には、シグナルされたエラーにハンドラーがなければEmacsをkillする。
この関数はerror-symbolで命名されるエラーをシグナルする。引数dataはエラー状況に関連する追加のLispオブジェクトのリスト。
引数error-symbolはエラーシンボル(error symbol) —
define-error
で定義されたシンボル — でなければならない。これはEmacs
Lispが異なる種類のエラーをクラス分けする方法である。エラーシンボル(error symbol)、エラーコンディション(error
condition)、コンディション名(condition name)の説明についてはエラーシンボルとエラー条件を参照のこと。
エラーが処理されない場合には、エラーメッセージをプリントするために2つの引数が使用される。このエラーメッセージは通常、error-symbolのerror-message
プロパティにより提供される。dataが非nil
なら、その後にコロンとdataの未評価の要素をカンマで区切ったリストが続く。error
にたいするエラーメッセージはdataのCARである(文字列であること)。サブカテゴリーfile-error
は特別に処理される。
data内のオブジェクトの数と意味はerror-symbolに依存する。たとえばwrong-type-argument
エラーではリスト内に2つのオブジェクト
— 期待する型を記述する述語とその型への適合に失敗したオブジェクト — であること。
エラーを処理する任意のエラーハンドラーにたいしてerror-symbolとdataの両方を利用できる。condition-case
はローカル変数を(error-symbol
. data)
というフォームでバインドする(エラーを処理するコードの記述を参照)。
このsignal
関数は決してリターンしない。エラーerror-symbolにたいするハンドラーがなく、noninteractive
(batchモードを参照)が非nil
なら、結果としてこの関数がEmacsをkillすることになる。
(signal 'wrong-number-of-arguments '(x y)) error→ Wrong number of arguments: x, y
(signal 'no-such-error '("My unknown error condition")) error→ peculiar error: "My unknown error condition"
この関数は、error
とまったく同じように振る舞うが、error
ではなくエラーシンボルuser-error
を使用する。名前が示唆するように、このエラーはコード自身のエラーではなく、ユーザー側のエラーの報告を意図している。たとえばInfoの閲覧履歴の開始を超えて履歴を遡るためにコマンドInfo-history-back
(l)を使用した場合、Emacsはuser-error
をシグナルする。このようなエラーでは、たとえdebug-on-error
が非nil
であっても、デバッガーへのエントリーは発生しない。エラーによるデバッガへのエンターを参照のこと。
Common Lispに関する注意: Emacs LispにはCommon Lispのような継続可能なエラーのような概念は存在しない。