web-dev-qa-db-ja.com

例外と例外階層内のエラーコード

例外内でエラーコードを使用してエラータイプを指定しても問題ないと思いますか?このコードを見てください:

public class MyException extends Exception {
    public static final String ERROR_CODE_INVALID_NAME = "";
    public static final String ERROR_CODE_INVALID_ID = "";
    ...

    private String errorCode;

    public MyException(String message, String errorCode) {
        super(message);
        this.errorCode = errorCode;
    }

    public String getErrorCode() {
        return errorCode;
    }
}

この例では文字列の代わりに列挙型を使用する方が良いことは知っていますが、実際にはエラーコードの概念について心配しています。ここでは例外階層の方が良いと思いますか?例外内のエラーコードがアンチパターンであると言っている信頼できる情報源が見つかりません。どうも。

12
Darkoboar

例外の原因(無効な名前または無効なID)に応じて(コードで)異なる反応をしたい場合は、異なる例外を設定することをお勧めします。

そうでない場合は、getErrorCode()メソッドも必要ありません。例外のメッセージにエラーコードを追加するだけで、例外によってデバッグに必要なすべての情報が得られます。

2
ughzan

エラーコードは次の場合に役立ちます

  • 完全なエラーメッセージを表示することはできません(食器洗い機の表示)
  • コードは内部で処理する必要があります(特定のコードが表示された場合、またはクライアントがメッセージを担当しているときにサーバーがクライアントにエラーコードを送信した場合、一部のロジックがトリガーされます)
  • 優れたマニュアルがあり、ユーザーはコードを使用して包括的な情報を取得できます
  • ユーザーは何が起こったのかを知る必要はありませんが、ベンダーに連絡する必要があります

そのため、ほとんどの場合、エラーコードに付加価値は見られません。私は、ログファイルで見つかった場合(プログラマーが会社を辞めた後でも)、本当に役立つ例外階層または少なくとも明確なエラーメッセージを好みます。

エラーコードの要件がある場合-解決策は悪くありません。完全なセットを簡単に交換できるように、中央リポジトリ(プロパティファイル)にallエラーコードを収集することを検討してください。

myexception.ERROR_CODE_INVALID_NAME=text or number
myexception.ERROR_CODE_INVALID_ID=text or number
8
Andreas_D

私の経験から、例外コードは主にユーザーへの情報メッセージとして使用されます。

エラーコードに応じて異なる反応をするために誰かが一般的な例外メッセージを解析しようとすることは一度も見たことがありません。通常は例外階層を介して行われます。

一方、特定のケースごとに新しい例外サブクラスを作成するのは難しい場合があり、例外コードが使用されます。
たとえば、ユーザーコードの場合、トランザクションが失敗した理由を測定しない場合は、何らかの方法でロールバックする必要がありますが、エンドユーザーの場合は、なぜ発生したのか(パラメータの誤り、データベース接続など)が重要です。

したがって、要約すると、さまざまな状況を処理するさまざまな方法を期待している場合は、さまざまな例外タイプを使用することをお勧めしますが、同じ方法でいくつかの問題を処理する必要があるが、特定の原因についてのみユーザーに通知する必要がある場合は、例外コードを使用する方が簡単です。

4

複雑な例外階層のスタックトレースをパフォーマンス的に作成することは、メモリと時間の両方の観点から非常にコストがかかるため、3〜4個の静的エラーコードで解決できるものに対して複雑なカスタム例外階層を作成する場合は...エラーが望ましいコードオプション。一般に、ランタイム例外(メソッドシグネチャでチェックインされていない)を使用することを好みます。チェックされた例外をキャッチする防御的なアプローチは、IMOより少し古くなっています。

2
aviad

私は通常、両方を組み合わせて使用​​します。

例外を分類し、設計上の決定を下す必要があります。

たとえば、例外のソース、タイプ、影響、処理などのパラメータを使用して、例外を分類できます。例外が同じカテゴリに分類される場合は、内のエラーコードを使用してください。さまざまなカテゴリに分類される例外には階層を使用します。

重要なパラメータの例外処理を選択した場合は、それらの処理方法に基づいて2つのオプションから選択できます。

  1. 1つのcatchブロックですべてのタイプをキャッチし、それらを一般的な方法で処理する場合は、エラーコードを使用します。
  2. 一度に特定のタイプをキャッチし、それに応じて処理する場合は、階層を使用します。
2