2016-05-12 5 views
1

私はロギングのためにlog4jを実装したSpringアプリケーションを作成しました。私のアプリケーションには300以上のエラー(例外)があります。私は個々のユーザー定義例外を各エラーに対して作成しました。これらのクラスはエラーメッセージを返す以外は何もしません。個々の例外を作成するエラーごとにユーザー定義の例外を作成する必要がありますか

理由:

  1. 開発者は、私は例外を作成するとき、それは、彼らが状況を処理するために処理する必要があり、デフォルトではエラーが表示され、任意のエラー状況を処理逃してはなりません。
  2. エラーのシナリオで個々のユーザー定義の例外を作成すると、ログを記録するときにログが記録されます。

今、私は疑問に思って:

  1. を各エラーのシナリオのための個々のユーザ定義の例外を作成することが必要ですか?
  2. ほとんどの人がエラーやユーザー定義の例外をより良い方法で処理する方法は?
+1

1. **いいえ**。 2.開発者が回復するのに合理的な方法でエラーを分類する。スタックトレースは例外がどこで発生したかを示します。そのため、カスタムカスタム例外を300個作成する理由が明確ではありません。 –

+0

本当に多くのカスタム例外を作成する必要はありません。おそらく、既存の例外クラスは、作成した多くの例外ではなく、十分に使用できることがわかります。次に、例外ごとに異なるメッセージと原因をコンストラクタに渡すことで、これらをより具体的にすることができます。 https://www.cs.cmu.edu/~pattis/15-1XX/15-200/lectures/exceptions/lecture.html https://docs.oracle.com/javase/7/docs/api/java/ lang/Exception.html –

答えて

2

例を使って質問を更新できたらうれしいです。私は現在かなりの数のエンタープライズアプリケーションを構築しています。私が通常従うモットーは、例外タイプがエラーの適切なカテゴリを説明しているかどうかを確認し、例外メッセージが何がうまくいかなかったかを適切に説明します。あなたが持っている例外のタイプを適切に分類する必要がない限り、カスタム例外を作成すべきではありません。ここでmabbasから良い例です:

When should we create our own java exception classes?

0

私はあなたの質問は良い方法では答えられないことができると思います。これは実際に異なる意見を話すことです。私の意見:あなたの個々の例外がすべて明確に定義されている限り(の意味が重複するではない)。それぞれには良いメッセージがあり、後で問題をデバッグするのに必要なものが付属しています。それでは心配しないでください。それが例外のために使用されるものです。より多くの(そしてカスタム)例外は、より具体的で細かいエラー処理を可能にします。

例外を使用する場合、厳しいコストがかかります(私たちの環境では、「独立」ノードAからノードBに例外を送信しています...そして今、突然、A、B一致するコードレベルにあります)、状況は異なります。次に、どのアーキテクチャが最も「投資収益率」が高いかを非常に注意深く考慮する必要があります。

0

300個の例外に対して300個のエラーを作成するような過剰使用のようです。私がやったことは私たちが返すことにしたいHTTPエラーを含む私たち自身のHttpErrorExceptionクラスを作成することでした。開発者は、例外またはエラーが発生したときに、そのうちの1つをスローするように指示されました。新しいHttpErrorExceptionsの1つではない例外が発生した場合は、500が返されます。特定のExceptionが常に特定のHTTPエラーにマップされると仮定するのは間違っていると感じたので、他の例外をHTTPエラーに変換しませんでした。なぜなら、多くの依存関係(私たちが使用している他のライブラリ)があり、特定の状況では私たちが気にしていたHTTPエラーにうまく対応しないかもしれないあらゆるタイプの例外が投げられるからです。だから私はむしろ明白である。

典型的な使い方の例です。

Account getAccount(String id){ 
    Account a = null; 
    try{ 
     a = accountRepo.findById(id); 
    catch(Exception e) { 
     String error = "Got exception while trying to get Account from db."; 
     logger.(error, e); 
     throw new HttpErrorException(500, error); 
     //or throw new HttpErrorException(HttpStatus.INTERNAL_SERVER_ERROR, error); 
    } 
    throw404IfNull(a); 
    return a; 
} 

throwIf404IfNullは、我々のコードでifステートメントを減らすために作成しただけの簡単な方法です。これらのメソッドのいくつかがあり、コードにはifのステートメントが含まれていません。

void throw404IfNull(Object obj){ 
    if(obj == null) { 
     throw new HttpErrorException(400, "Object was not found"); 
    } 
} 

は、我々は例外であるエラー状態と素敵うまくフォーマットされたHTTPエラーが発生したため、すべてHttpErrorException年代をマッピングするためにSpringの例外処理機能を使用します。

関連する問題