Previous: Handling Errors, Up: Errors


9.5.3.4 エラーシンボルと条件名

エラーを通知するときには、読者が意図するエラーの種類を指定する エラーシンボル(error symbol)を指定します。 各エラーには、それを分類する一意な名前があります。 これは、Emacs Lisp言語で定義されたエラーを細分類したものです。

これらの細分類は、エラー条件(error conditions)と呼ばれる より大きなクラスの階層にまとめられています。 エラー条件は、条件名(condition names)で識別します。 もっとも細かい分類は、エラーシンボルそのものです。 各エラーシンボルは条件名でもあります。 より大きなクラスを表す条件名errorもあります。 これはすべての種類のエラーを表します。 したがって、各エラーには、1つ以上の条件名があります。 つまり、errorerrorとは別のエラーシンボル、あるいは、 その中間の分類に属するものです。

あるシンボルがエラーシンボルであるためには、そのシンボルには、 条件名のリストを与える属性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