2012-11-08 12 views
6

私は大規模な多層のJavaアプリケーションでエラー処理のハンドル(har-har)を取得しようとしている緑色の開発者です。いくつかの層を介して例外を連鎖させることは良いアイデアだと私は信じている多くの状況があります。例えば最下層で、いくつかの外部サービスに呼び出すの失敗は、ビュー内のすべての方法まで問題を起こした場合:チェーンされた例外をログに記録するのはいつですか?

  • コンテンツXが要求されますが、ユーザーはによって引き起こさ
    • 認可されていません:許可のリストをユーザーがnullによって引き起こさ
      • :ユーザー管理Webサービスは、不正要求 - パラメータfooは 'XYZ'
0のようにフォーマットする必要があります答えました

私が本当に調べたいスタックトレースを持つ最も重要な例外は、チェーンの最後のものです。私は悪い要求をしたので、私はfooのフォーマットを修正する必要があります。しかし、私はこの例外をレイヤーにバブルアップさせると、各レイヤーに意味のある例外に連鎖してしまいます...最終的にキャッチしてログに記録するとき、デフォルトのログの振る舞いは常に最外の例外おそらく根本原因のスタックトレースの5行。

これにより、例外が発生したときにログに記録して、それをバブルアップさせたいが、その後ほとんどのものを2回ログに記録する。彼らが起こったとき、そして彼らが最終的に捕らえられるとき。

ここでベストプラクティスは何ですか?

+0

これには多くの意見がありますが、「真実」はありません。最も外側の層とそれにログオンする) – Friso

答えて

1

大きな質問ですが、私はあなたが得る他の答えが不思議です。

私は「より良い」アプローチを取って、それぞれのステップでログに記録する傾向があります。これは大きなログを作りますか?はい、大規模なJavaアプリケーションで問題をデバッグしているときは、あなたが持っているすべてのログラインに感謝します。大きなファイルをフィルタリングするのに役立つツール(少なくともgrepawksedトリオ)もあります。

もう1つの手法は、このログコードを書きますが、log4jのようなものを使用している場合は、TRACEレベルにします。こうすることで、問題が発生した場合はログを利用できない場合がありますが、ログのしきい値を下げるために1行の変更があり、デバッグのための豊富なデータの生成が開始されます。

以前の手法と並行して、ほとんどのログライブラリ(ここでも私はlog4jに関する知識がなくなりました)では、さまざまなJavaパッケージのログレベルを調整できます。つまり、これらの "catch and rethrow"ログラインをすべてトレースとして書き込み、下位レベルパッケージのログをWARNに下げ、上位パッケージをまたはTRACEにすることができます。

2

例外管理のアプローチが異なることをお勧めします。アプリケーションの最上位レイヤー(要求エントリーポイントなど)で、実行時例外を呼び出すtry catchブロックを作成します。キャッチブロックが2つあることが望ましい: - アプリケーション固有の(ビジネス上の)例外の場合 - 残りの場合(例外)

拡大する独自の例外タイプを紹介する必要があることがわかりますさまざまな目的のために異なる例外を作成します。たとえば、アプリケーションの各レイヤー、各インテグリオンなどのカスタム例外を作成できます。すべてがトップレベルで処理されるので、チェックされていないexeptionsを使用してください。 - ビジネスコンテキストに関連付けられた説明を挿入する(例:「DBからのアカウントデータの読み込みに失敗しました」 - 元の例外の説明を追加する(たとえば、「元の例外」の説明を追加するエラー:DBへの接続に失敗しました ") - トレースを紛失しないように例外に元の例外を渡す - 投げて忘れる、言い換えればトップレベルのキャッチブロックが適切に処理する責任があります(トランザクションのロールバック、エラーメッセージの表示あなたが必要とする可能性のあるものその他

+0

良いアプローチだと思われる。カスタム例外をトップレイヤーまでバブルすると、その根本原因をロガーに渡すことができる場所が1つあります。 しかし、私がキャッチしてそれらの1つを記録する必要がある場所がある場合、私はラップされた例外をログに記録します。私のラッパー例外のスタックトレースを1行または1行だけに切り捨てると何か問題はありますか?なぜそれが問題を引き起こすのかはわかりませんが、スタックトレースを修正するだけで私にとってはまったく正しいとは言えません。 – PotataChipz

関連する問題