2015-09-29 1 views
10

例外に関する2つのコードを使用することをお勧めします。ExceptionとException.getMessageの印刷

//code1 

} catch (SomeException e) { 
    logger.error("Noinstance available!", e.getMessage()); 
} 

//code2 
} catch (SomeException e) { 
    logger.error("Noinstance available!", e); 
} 

例外のgetMessageメソッドはいつ使用しますか?

+1

ほとんど常に。 SomeExceptionとoverriden toStringメソッドが分かっている場合を除きます。 e.getMessage()は標準的な方法です –

+2

メッセージのみを記録する場合は、スタックトレースを取得しないか、ネストされた例外が存在するはずです。例外をログに記録してください... –

+2

@ TheNeoNoirDeveloper: "ほとんどすべての時間"は何ですか?最初?私は、例外がどこから来たのかに関する情報を失わないことを好みます。 –

答えて

10

メソッドerrorStringを第1パラメータとして受け入れ、第Throwableを第2パラメータとして受け入れるため、第1はコンパイルされません。

e.getMessage()Throwableではありません。

コードは、メッセージ

} catch (SomeException e) { 
    // Prints message and stack trace 
    logger.error("Noinstance available!", e); 
} 

第一プリントと比較

} catch (SomeException e) { 
    // No stack trace 
    logger.error("Noinstance available! " + e.getMessage()); 
} 

であるべきです。 2番目のコマンドはスタックトレース全体も表示します。

スタックトレースを印刷する必要があるかどうかは、コンテキストによって異なります。

例外がスローされる理由がわかっている場合は、スタックトレース全体を印刷することはお勧めできません。

わからない場合は、エラーを簡単に見つけるために、縞模様全体を印刷する方がよいでしょう。

+0

私はsl4j loggerを使用していて、私のcode1がコンパイルされています。なぜでしょうか – DesirePRG

+0

私の情報は標準のlog4j用ですが、残りは有効です –

0

Exception.printStackTrace()は、デバッグなどの場合を除き、使用しないでください。

ロギングの場合は、Exception.getMessage()を使用することをお勧めします。また、多くのロギングフレームワーク(Log4jなど)では、ロギングメソッド(たとえばerror())の引数としてそれ自体を例外として受け入れ、それ自体で動作します。

1

元の例外(SomeException)のスタックトレースが必要かどうかによって異なります。はいの場合、ここでcode2は正しいオプションです。これは、これらの状況を処理するより一般的な方法であることに注意してください。

元の例外に興味がない場合は、code1を使用できますが、これは正しくありません。送信したコードは引数としてメッセージを受け取るためです。だから、正しい方法は次のとおりです。

logger.error("Noinstance available! - reason:" + e.getMessage()); 
2

あなたはビジネスレベル技術例外に例外を分類すると、このプロトタイプは、便利です。

ビジネスレベルの例外については、アナリティクスのログでメッセージを使用するか、意味情報(何か問題があります)を表示することがあります。

技術的な例外として、stacktraceでエラーをログに記録して問題を発見し、デバッグと解決が容易です。スタックトレースで

1

logger.error("Could not do XYZ because of: " + ex, ex); 

スタックトレースなし:あなたはこれを試すことができ

logger.error("Could not do XYZ because of: " + ex); 
0

: -

logger.error(e.getMessage(), e); 

それは、このThrowableオブジェクトの詳細メッセージ文字列を返します。

logger.error(e.getLocalizedMessage(),e); 

このスロー可能オブジェクトの、ローカライズされた記述を作成します。ロケール固有のメッセージを生成するために、サブクラスはこのメソッドをオーバーライドできます。このメソッドをオーバーライドしないサブクラスの場合、デフォルト実装はgetMessage()と同じ結果を返します。

あなたのケースでは、eは例外の対象に他ならない...

getLocalizedMessage()uがローカライズされたメッセージの意味はすなわち、あなた自身のメッセージを無視して与える必要があります。