エラーをシグナルするとき、想定するエラーの種類を指定するためにエラーシンボル(error symbol)を指定します。エラーはそれぞれ、それをカテゴリー分けするために単一のエラーシンボルをもちます。これはEmacs Lisp言語で定義されるエラーを分類する、もっともよい方法です。
これらの狭義の分類はエラー条件(error
conditions)と呼ばれる、より広義のクラス階層にグループ化され、それらはコンディション名(condition
names)により識別されます。そのようなもっとも狭義なクラスは、エラーシンボル自体に属します。つまり各エラーシンボルは、コンディション名でもあるのです。すべての種類のエラー(quit
を除く)を引き受けるコンディション名error
に至る、より広義のクラスにたいするコンディション名も存在します。したがって各エラーは1つ以上のコンディション名をもちます。つまりerror
、error
とは区別されるエラーシンボル、もしかしたらその中間に分類されるものかもしれません。
シンボルをエラーシンボルとするために、シンボルは親コンディションを受け取るdefine-error
で定義されなければならない。この親はその種のエラーが属するコンディションを定義する。親の推移的な集合は、常にそのエラーシンボルとシンボルerror
を含む。quitはエラーと判断されないので、quit
の親の集合は単なる(quit)
である。
親のコンディションに加えてエラーシンボルはメッセージ(message)をもち、これは処理されないエラーがシグナルされたときプリントされる文字列です。そのメッセージが有効でなければ、エラーメッセージ‘peculiar error’が使用されます。Definition of signalを参照してください。
内部的には親の集合はエラーシンボルのerror-conditions
プロパティに格納され、メッセージはエラーシンボルのerror-message
プロパティに格納されます。
以下は新しいエラーシンボルnew-error
を定義する例です:
(define-error 'new-error "A new error" 'my-own-errors)
このエラーは複数のコンディション名 —
もっとも狭義の分類new-error
、より広義の分類を想定するmy-own-errors
、およびmy-own-errors
のコンディションすべてを含むerror
であり、これはすべての中でもっとも広義なものです。
エラー文字列は大文字で開始されるべきですが、ピリオドで終了すべきではありません。これはEmacsの他の部分との整合性のためです。
もちろんEmacs自身がnew-error
をシグナルすることはありません。あなたのコード内で明示的にsignal
(Definition of signalを参照)を呼び出すことにより、これを行なうことができます。
(signal 'new-error '(x y)) error→ A new error: x, y
このエラーは、エラーの任意のコンディション名により処理することができます。以下の例はnew-error
とクラスmy-own-errors
内の他の任意のエラーを処理します:
(condition-case foo (bar nil t) (my-own-errors nil))
エラーが分類される有効な方法はコンディション名による方法で、その名前はハンドラーのエラーのマッチに使用されます。エラーシンボルは意図されたエラーメッセージと、コンディション名のリストを指定する便利な方法であるという役割をもつだけです。1つのエラーシンボルではなく、コンディション名のリストをsignal
に与えるのは面倒でしょう。
対照的にコンディション名を伴わずにエラーシンボルだけを使用すると、それはcondition-case
の効果を著しく減少させるでしょう。コンディション名はエラーハンドラーを記述するとき、一般性のさまざまなレベルにおいて、エラーをカテゴリー分けすることを可能にします。エラーシンボルを単独で使用することは、もっとも狭義なレベルの分類を除くすべてを捨ててしまうことです。
主要なエラーシンボルとそれらのコンディションについては、標準的なエラーを参照してください。