エラーを通知するとは、エラー処理を開始することを意味します。通常、エラー処理では実行中のプログラムの全部または一部を中断し、エラー処理用に設定された箇所に戻ります(Emacsのエラー処理方法を参照)。ここでは、エラーを通知する方法について説明します。
ほとんどのエラーは、整数のCARを取得しようとしたり、バッファ末尾から1文字進めようとしたりする場合など、他の目的で呼び出すLispプリミティブ内で自動的に通知されます。また、errorおよびsignal関数を用いて明示的にエラーを通知することも可能です。
ユーザーが C-g と入力した際に発生する終了は、エラーとはみなされませんが、ほぼエラーと同様に処理されます。終了を参照してください。
あらゆるエラーは、何らかの形でエラーメッセージを指定します。メッセージには、本来どうあるべきか(「ファイルが存在しなければならない」)ではなく、何が問題なのか(「ファイルが存在しない」)を記載すべきです。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'
error は、エラーシンボル error
と、format-message が返す文字列を含むリストという2つの引数を渡して signal を呼び出すことで動作します。
通常、フォーマット内のグレイヴアクセントやアポストロフィは、対応する曲線引用符に変換されます。例えば、"Missing `%s'" は "Missing
‘foo’" になる場合があります。この変換を制御または抑制する方法については、テキスト引用スタイル を参照してください。
警告: 独自の文字列をそのままエラーメッセージとして使用したい場合は、単に (error string) と記述しないでください。string や string に ‘%’、‘`’、または
‘'’
が含まれている場合、再フォーマットされ、望ましくない結果を招く可能性があります。代わりに (error
"%s" string) を使用してください。
noninteractive が nil
以外である場合(バッチモード
を参照)、この関数は、通知されたエラーにハンドラが存在しない場合に Emacs を終了させます。
この関数は、error-symbol で指定された名前のエラーを報告します。引数 data は、エラーの状況に関連する追加の Lisp オブジェクトのリストです。
引数 error-symbol は エラーシンボル—define-error
で定義されたシンボルである必要があります。これが Emacs Lisp
における各種エラーの分類方法です。エラーシンボル、エラー条件、および条件名の説明については、エラーシンボルと条件名 を参照してください。
エラーが処理されない場合、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 が nil
以外である場合(バッチモード を参照)、この関数は最終的に
Emacs を強制終了させます。
(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 ではなくエラーシンボル user-error を使用する点を除けば、error
と全く同様に動作します。その名の通り、これはコード自体のエラーではなく、ユーザー側のエラーを報告するためのものです。例えば、Info
閲覧履歴の開始位置より前に戻ろうと Info-history-back (l) コマンドを使用しようとした場合、Emacs は user-error を通知します。このようなエラーは、たとえ debug-on-error が nil
でない場合であっても、デバッガへの進入を引き起こすことはありません。エラー時のデバッガへの進入 を参照してください。
Common Lispに関する注記: Emacs Lispには、Common Lispにおける継続可能なエラーという概念に相当するものはありません。