エラー処理メモ

エラー情報を定義する意味

  • 複数のエラーを一意に識別し、個々のエラーに対し処理を行う
  • エラーの原因特定を助けるため

エラー情報

  • 識別子 (整数、識別子(文字列等)、例外クラス名などエラーを区別するのに用いる)
  • メッセージ (人間に対する)
  • データ (原因に関するもの)

識別方法

  • 整数 (Windows APIや例外機構を持たない言語, HT

TP通信などで使われている)

  • 識別子 (整数に名前を与えるため定義している場合が多い)
  • 例外クラス (例外処理を持つ言語で使われている

包含関係

  • 整数
    • 5xxはサーバー側のエラーなど、と決めて下の数字を順次割り当てる (HTTP)
  • 識別子
    • NETWORK_XXX_ERRなどのようにプレフィクスをつける
  • 例外クラス
    • 継承を用いている

タイプミスに対して

  • 整数
  • 識別子
    • 強い。言語にもよるが、未定義の識別子を参照するとコンパイラ等によって間違いに気づく。
  • 例外クラス
    • 強い。例外クラス名は識別子なので、識別子の性質も持っている。
  • エラーメッセージを自動登録
// 適当なクラス
var HogeClass = {
    // HogeClassに関するエラー情報クラス
    ErrorInfo: function(message, name){
        var class = arguments.callee._class;
        name = name || 'ERROR_'+class.errorInfo.length;
        
        this.message = message;
        class.errorInfo[name] = this;
        class.errorInfo.length++;
    }, 
    // エラー情報
    errorInfo: {'length': 0}
};
HogeClass.ErrorInfo._class = HogeClass;

try{
    // newと同時にエラー情報が登録される
    throw new HogeClass.ErrorInfo('パラメータが無効', 'INVALID_PARAM_ERR');
}catch(e){
    // エラー情報の区別に使える
    if( e === HogeClass.errorInfo.INVALID_PARAM_ERR ){
        // 個別のエラー処理
    }
}
  • エラー情報を管理する労力が少ない。
  • エラー情報を一括して定義せずとも、コード中必要になっときに定義すれば(書けば)よい。
    • 定義部分のコードが実行されるたびに定義されるのが難点 (→クラス内部で重複定義を防止すればいい)
    • 複数の場所で同一の識別子が定義された場合どうするか?
  • 動的にエラー情報が登録されるので、エラー識別子全体が把握しづらい (通過しない部分のエラー情報は定義されない)