この質問は、周りの議論によって引き起こされました 、私が良い答えを受け取らなかったこの記事。
他の方法で処理できない場合、例外をログに記録してから再スローする(もちろん元のスタックトレースを保持する)のはなぜ悪い考えですか?
回答:
答えは主に、それを処理できないのになぜそれを捕まえているのかということだと思います。ログに値すると感じた場合は、処理できる人(または処理する以外に選択肢がない人)にログを記録させてはどうでしょうか。
それをキャッチしてログに記録し、再スローすると、アップストリームコードが例外をログに記録したことを知る方法がないため、同じ例外が2回ログに記録される可能性があります。さらに悪いことに、すべてのアップストリームコードがこの同じパターンに従っている場合、例外は、キャッチしてログに記録してから再度スローすることを決定したコードのレベルごとに1回、任意の回数ログに記録される可能性があります。
また、例外のスローとキャッチは比較的コストのかかる操作であるため、このキャッチと再スローはすべてランタイムパフォーマンスに役立たないと主張する人もいるかもしれません。また、簡潔さや保守性の観点からもコードを支援するものではありません。
ログアンドスローは、例外をキャッチして再スローするエンティティが、少なくとも最も望ましい方法ではなく、コールスタックの上位にログに記録されない情報が含まれていると信じる理由がある場合に適したパターンです。これが発生する可能性のあるいくつかの理由:
e.getMessage()
実行時例外にはあらゆる種類の機密情報が含まれている可能性があるため、例外コンテンツの公開(UIでの/ stacktraceの表示やREST応答としての送信など)は脆弱性自体として扱う必要があります。#2に関して:クライアントに知らせたいすべての情報(+根本原因)を追加して例外を再スローできます。何もログに記録する必要はありません。
最も単純な理由は、通常、単一のトップレベルハンドラーがこれを実行するため、この例外処理でコードを汚染する必要がないことだと思います。
横断的関心事の議論は、基本的に、あなたに関係のないエラーを処理するのは時間の無駄であるということです。適切なハンドラーが見つかるまで、エラーがコールスタックをバブルアップさせる方がはるかに優れています。
私の意見では、例外をキャッチする必要があるのは、結果を使って何か役立つことができるときだけです。単にログを記録するためにキャッチすることは、その作業をさらに一元化できるため、役に立ちません。
IMOのログとスローは、驚き最小の原則の明らかな違反です。
例外がコールスタックのさらに上で適切に処理される場合、エラーログエントリの価値はまったくない可能性があります。そして、エラーログエントリを見つけるのは混乱します。