Next: , Up: Errors   [Contents][Index]


10.5.3.1 エラーをシグナルする方法

エラーのシグナリング(signaling)とは、エラーの処理を開始することを意味します。エラー処理は通常は実行中のプログラムのすべて、または一部をアボート(abort)してエラーをハンドルするためにセットアップされた位置にリターンします。ここではエラーをシグナルする方法を記述します。

ほとんどのエラーは、たとえば、整数にたいしてCARを求めたり、バッファーの最後で1文字前方に移動したときなどのように、他の目的のために呼び出したLisp基本関数の中で、“自動的”にシグナルされます。関数errorsignalで、明示的にエラーをシグナルすることもできます。

ユーザーがC-gをタイプしたときに発生するquitはエラーとは判断されませんが、ほとんどはエラーと同様に扱われます。Quittingを参照してください。

すべてのエラーメッセージはそれぞれ、何らかのエラーメッセージを指定します。そのメッセージは何が悪いのか(“File does not exist”)、物事がどうしてそうあるべきではない(“File must exist”)かを示すべきです。Emacs Lispの慣習ではエラーメッセージは大文字で開始され、区切り文字で終わるべきではありません。

Function: error format-string &rest args

この関数は、format-stringargsにたいして、format(Formatting Stringsを参照してください)を適用することにより構築されたエラーメッセージとともに、エラーをシグナルします。

以下はerrorを使用する典型的な例である:

(error "That is an error -- try something else")
     error→ That is an error -- try something else

(error "You have committed %d errors" 10)
     error→ You have committed 10 errors

2つの引数 — エラーシンボルerrorと、formatによりreturnされる文字列を含むリスト — でsignalを呼び出すことにより、errorは機能します。

警告: エラーメッセージとして固定の文字列を使用したい場合、単に(error string)とは記述しないでください。もしstringが‘%’を含む場合、それはフォーマット指定子(format specifier)として解釈されてしまうので、望む結果は得られません。かわりに、(error "%s" string)を使用してください。

Function: signal error-symbol data

この関数はerror-symbolで命名されるエラーをシグナルする。引数dataはエラー状況に関連する追加のLispオブジェクトのリスト。

引数error-symbolは、エラーシンボル(error symbol)define-errorにより定義されYたシンボル — でなければなりません。これはEmacs Lispが異なる種類のエラーをクラス分けする方法です。エラーシンボル(error symbol)、エラーコンディション(error condition)、コンディション名(condition name)の説明については、Error Symbolsを参照してください。

エラーが処理されない場合には、エラーメッセージをプリントするために2つの引数が使用される。このエラーメッセージは通常、error-symbolerror-messageプロパティーにより提供される。dataが非nilなら、その後にコロンとdataの未評価の要素をカンマで区切ったリストが続く。errorにたいするエラーメッセージはdataCARである(文字列であること)。サブカテゴリーfile-errorは特別に処理される。

data内のオブジェクトの数と意味はerror-symbolに依存する。たとえばwrong-type-argumentエラーではリスト内に2つのオブジェクト — 期待する型を記述する述語とその型への適合に失敗したオブジェクト — であること。

エラーを処理する任意のエラーハンドラーにたいしてerror-symboldataの両方を利用できる。condition-caseはローカル変数を(error-symbol . data)というフォームでバインドする(Handling Errorsを参照)。

関数signalは決してリターンしない。

(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"
Function: user-error format-string &rest args

この関数は、errorとまったく同じように振る舞うが、errorではなくエラーシンボルuser-errorを使用する。名前が示唆するように、このエラーはコード自身のエラーではなく、ユーザー側のエラーの報告を意図している。たとえばInfoの閲覧履歴の開始を超えて履歴を遡るためにコマンドInfo-history-back (l)を使用した場合、Emacsはuser-errorをシグナルする。このようなエラーでは、たとえdebug-on-errorが非nilであっても、デバッガーへのエントリーは発生しない。Error Debuggingを参照のこと。

Common Lispに関する注意: Emacs LispにはCommon Lispのような継続可能なエラーのような概念は存在しない。