6

私は、大規模な多層 Java アプリケーションでエラー処理のハンドル (har-har) を取得しようとしている環境に優しい開発者です。例外をいくつかの層に連鎖させることが良い考えであると私が信じる状況はたくさんあります。たとえば、最下層の外部サービスの呼び出しに失敗すると、ビュー全体で問題が発生します。

  • コンテンツ X が要求されましたが、ユーザーは許可されていません
    • 原因: 許可されたユーザーのリストが null です
      • 原因: ユーザー管理 Web サービスが無効な要求を応答しました - パラメータ foo は「xyz」のようにフォーマットする必要があります

最も重要な例外は、スタック トレースを実際に調べたい例外であり、チェーンの最後の例外です。不適切なリクエストを行ったため、foo のフォーマットを修正する必要があります。しかし、この例外をレイヤーにバブルアップさせると、各レイヤーにとって意味のある例外にうまく連鎖されます...最終的に物事をキャッチしてログに記録すると、デフォルトのログ動作は常に最も外側の例外に関する詳細のゴブを表示します.根本原因のスタック トレースのおそらく 5 行。

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

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

4

2 に答える 2

2

例外管理の別のアプローチをお勧めします。アプリケーションの最上層 (リクエスト エントリ ポイントなど) で、実行時例外を呼び出すための try catch ブロックを作成します。2 つの catch ブロックを用意することをお勧めします: - アプリケーション固有の (ビジネス) 例外用 - 残り (例外) 用

ご覧のとおり、さまざまな目的でさまざまな例外を作成するために拡張する独自の例外タイプを導入する必要があります。たとえば、アプリケーションのすべてのレイヤー、各統合などに対してカスタム例外を作成できます。チェックされていない例外はすべて最上位で処理されるため、使用します。例外的な状況 (低レベルの例外のキャッチ) が発生した場合は、次のことを行う必要があります。 DB への接続に失敗しました") - トレースを失わないように、元の例外を例外に渡します - スローして忘れます。つまり、最上位レベルの catch ブロックが適切に処理する責任があります (トランザクションのロールバック、

于 2012-11-08T09:08:02.177 に答える
1

素晴らしい質問です、私はあなたが得る他の答えについて興味があります。

私は「多ければ多いほど良い」アプローチを取り、途中の各ステップでログに記録する傾向があります。これは大きなログを作成しますか?はい。ただし、大規模なJavaアプリケーションで問題をデバッグする場合は、ログ行ごとに感謝します。大きなファイルをフィルタリングするのに役立つツール(少なくとも、、、トリオ)もありgrepますawksed

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

以前の手法と並行して、ほとんどのロギングライブラリ(ここでもlog4jの知識に頼っています)を使用すると、さまざまなJavaパッケージのログレベルを調整できます。WARNこれは、これらの「キャッチアンドリスロー」ログ行をすべてトレースとして書き込み、上位レベルのパッケージをDEBUGまたはに保持している間、下位レベルのパッケージのログを減らすことができることを意味しますTRACE

于 2012-11-08T05:50:23.607 に答える