エラーを報告する際は、想定しているエラーの種類を示すエラーシンボルを指定します。各エラーには、それを分類するためのエラーシンボルがただ一つだけ割り当てられています。これが、Emacs Lisp言語で定義されている最もきめ細かなエラー分類です。
これらの細分化された分類は、条件名によって識別されるエラー条件と呼ばれる、より広範なクラスの階層構造にまとめられています。こうしたクラスの中で最も細分化されたものは、エラーシンボルそのものに属しており、各エラーシンボルもまた条件名となります。また、より広範なクラスに対する条件名も存在し、あらゆる種類のエラーを包含する条件名error(ただしquitは除く)まであります。したがって、各エラーには1つ以上の条件名が割り当てられています。具体的には、エラーシンボルがerrorと異なる場合はerrorとなり、さらにいくつかの中間的な分類が存在する場合もあります。
シンボルがエラーシンボルとなるためには、親条件(デフォルトは error)を取る define-error
で定義される必要があります。この親条件は、この種のエラーが属する条件を定義します。親の推移的集合には、常にエラーシンボル自体とシンボル error が含まれます。終了はエラーとはみなされないため、quit の親の集合は単に (quit) となります。
エラーシンボルには、親要素に加えて message があり、これは当該エラーが通知されたものの処理されなかった場合に出力される文字列です。このメッセージが無効な場合は、エラーメッセージ ‘peculiar error’ が使用されます。シグナルの定義を参照してください。
内部的には、親の集合はエラーシンボルのerror-conditionsプロパティに、メッセージはエラーシンボルのerror-messageプロパティに格納されています。
新しいエラーシンボル new-error の定義は以下の通りです。
(define-error 'new-error "A new error" 'my-own-errors)
このエラーにはいくつかの条件名があります。最も限定的な分類であるnew-error、より広範な分類と思われるmy-own-errors、そして、最も広範なerrorを含むはずのmy-own-errorsのすべての条件です。
エラー文字列は大文字で始めるべきですが、末尾にピリオドを付けてはいけません。これはEmacsの他の部分との一貫性を保つためです。
当然ながら、Emacsが自ら new-error をシグナルすることはありません。コード内で明示的に
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))
エラーの主要な分類方法は、そのコンディション名――エラーとハンドラを対応付けるために使用される名称――によるものです。エラーシンボルは、意図するエラーメッセージとコンディション名のリストを指定するための便宜的な手段に過ぎません。単一のエラーシンボルではなく、signalにコンディション名のリストを指定するのは煩雑でしょう。
対照的に、条件名を用いずエラーシンボルのみを使用すると、condition-case
の表現力が著しく低下します。条件名があれば、エラーハンドラを記述する際に、さまざまな粒度でエラーを分類することが可能になります。エラーシンボルのみを使用すると、最も粒度の細かい分類以外はすべて排除されてしまいます。
この関数は、symbol が有効なエラー条件名である場合、non-nil を返します。
この関数は、condition がエラー記述子 error
のエラーシンボルの親であるかどうかを判定します。エラー記述子 error の型が条件名 condition に属する場合、non-nil を返します。
主要なエラー記号とその発生条件の一覧については、標準エラーを参照してください。