次のコードがあるとします。
void foo() {
/* ... */
try {
bar(param1);
} catch (MyException e) {
/* ??? */
}
}
void bar(Object param1) throws MyException {
/* ... */
try {
baz(param2);
} catch (MyException e) {
/* ??? */
}
}
void baz(Object param2) throws MyException {
/* ... */
if (itsAllATerribleMistakeOhNo) {
/* ??? */
throw new MyException("oops, error.");
}
}
エラーをどこでどのようにログに記録する必要があるのか疑問に思っています。
- 以下のbaz()でエラーが発生した場合、どの操作が失敗したかを正確に把握しており、その事実をログに記録できます。
- 一番上には、最も一般的なコンテキストがあります(たとえば、処理中にエラーが発生した接続のIPは何ですか)。
- 途中で、上部にも下部にもわからないコンテキストがあるかもしれません。
もう1つの厄介な問題は、下のエラーが上から見たときに実際にはエラーと見なされない可能性があることです(たとえば、データベースで何かを検索すると失敗します。確信が持てなかった可能性があります)。そのため、logger.WARN()
の代わりに選択する可能性がありますlogger.ERROR()
。
したがって、上記では3つの場所(下、上、および途中)について説明しましたが、ログを記録する場所だけでなく、何をスローするかという問題でもあります。中央のすべてのレベルで、2x2のオプションがあります。
- メッセージをログに記録する/ログに記録しない
- 元の例外をスローする/追加されたメッセージを含む新しい例外で例外をラップします。
これらの複雑な選択に関するベストプラクティス、またはいくつかの一般的な知恵は何ですか?
注:エラー処理/例外の使用全般については質問していません。上記のジレンマについてだけ質問しています。