前: Handling Errors, 上: Errors
エラーを通知するときには、読者が意図するエラーの種類を指定する エラーシンボル(error symbol)を指定します。 各エラーには、それを分類する一意な名前があります。 これは、Emacs Lisp言語で定義されたエラーを細分類したものです。
これらの細分類は、エラー条件(error conditions)と呼ばれる
より大きなクラスの階層にまとめられています。
エラー条件は、条件名(condition names)で識別します。
もっとも細かい分類は、エラーシンボルそのものです。
各エラーシンボルは条件名でもあります。
より大きなクラスを表す条件名errorもあります。
これはすべての種類のエラーを表します。
したがって、各エラーには、1つ以上の条件名があります。
つまり、error、errorとは別のエラーシンボル、あるいは、
その中間の分類に属するものです。
あるシンボルがエラーシンボルであるためには、そのシンボルには、
条件名のリストを与える属性error-conditionsがあることが必要です。
このリストは、そのエラーが属するエラー条件を定義します。
(エラーシンボルそのものと、シンボルerrorは、
つねにこのリストの要素であること。)
したがって、条件名の階層は、
エラーシンボルの属性error-conditionsで定義されます。
error-conditionsリストに加えて、
エラーシンボルには、属性error-messageも必要です。
この属性の値は、そのエラーが処理されないときに表示される文字列です。
属性error-messageがあるのに、それが文字列でなければ、
エラーメッセージ`peculiar error'を使います。
以下に、新たなエラーシンボルnew-errorの定義方法を示します。
(put 'new-error
'error-conditions
'(error my-own-errors new-error))
=> (error my-own-errors new-error)
(put 'new-error 'error-message "A new error")
=> "A new error"
このエラーには、3つの条件名があります。
もっとも細かい分類であるnew-error、
それより大きな分類とであると考えているmy-own-error、
もっとも大きな分類であるerrorです。
エラー文字列は大文字で始めるべきですが、ピリオドで終えません。 これは、Emacsの他の慣習と整合をとるためです。
普通、Emacs自身がnew-errorを通知することはありえません。
つぎのように、読者のコードで明示的に
signal(see Signaling Errors)を呼んだときだけです。
(signal 'new-error '(x y))
error--> A new error: x, y
このエラーは、3つの条件名のどれでも処理できます。
つぎの例は、new-errorと
クラスmy-own-errorsの任意の他のエラーを処理します。
(condition-case foo
(bar nil t)
(my-own-errors nil))
エラーを分類する重要な方法は、それらの条件名によることです。
つまり、エラーに一致するハンドラを探すために条件名を使います。
エラーシンボルは、意図したエラーメッセージと条件名のリストを指定する
簡便な方法を提供するだけです。
signalに、1つのエラーシンボルではなく、
条件名のリストを指定するのではわずらわしいでしょう。
一方、条件名なしにエラーシンボルだけを使うのでは、
condition-caseの能力をいちじるしく損ないます。
条件名があることで、エラーハンドラを書くときにさまざまなレベルに
一般化してエラーを分類できるのです。
エラーシンボルだけを使ったのでは、
最細分類以外のレベルを削除してしまうことになります。
すべての標準エラー名とそれらの条件名については、 See Standard Errors。