2011-10-19 16 views
2

例外処理についての質問があります。 私はあなたにとってはかなり簡単かもしれないと思いますが、私にとっては、マルチティアプロジェクトで例外を処理する方法を知りません。マルチティアで例外を処理する最善の方法

私の解決策では、私はいくつかのプロジェクトがあるとしましょう。

DataAccess、BizComponent、WCF、Proxy、およびPresentation(上位)があります。

DataAccessで "catch catch"を試み、BizComponentとBizComponentに例外をスローしようとしましたが、もう一度 "try catch"を実行してエラーをログに記録し、再度例外をWCFにスローします。

WCFレイヤーとプロキシレイヤーでは、同じことをしています。プレゼンテーションレイヤーでは、エンドユーザーにカスタムメッセージを表示します。

私のシニアは、WCFと上位層で「キャッチしよう」だけを開始する必要があることを教えてくれました。 DataAccessとBizComponentで処理する必要はありません。 WCFにキャッチされるためです。

DataAccessで例外をキャッチしようとすると、BizComponentと 例外がスローされるか、WCFでしか捕捉しようとしないと、上位層にスローされますか?

どちらが優れていますか?

ご質問が不明な場合は、お知らせください。 これは私の最初の多層プロジェクトなので、混乱させてしまいます。 ありがとうございます。

答えて

2

あなたが何かをする予定がある場合は、例外を処理(catch)するだけです。

たとえば、「上位」レイヤーに追加情報を提供する場合は、データレイヤーでデータベース例外をキャッチすることができます。

私が個人的に使用するアプローチは、ビジネスレイヤーで例外をキャッチしてログに記録してから、スタック内の上位のレイヤーに対してより親しみやすい情報を提供する同じ例外またはラップ例外を再投入することです。これにより、一貫したロギングプロセスが提供され、アプリケーションにボイラープレートロギングコードは必要ありません。

複数のアプリケーションでコードを再利用し、異なるログストアが必要な場合、これは依存性注入を使用して処理できます。

+0

私はDataAccessの "try catch"では何もしませんが、例外をキャッチして上位層に例外をスローします。私が上層に何も提供しないのであれば、必要ないのですか? – kevin

+1

@kevinもしあなたがキャッチ内で何もしていなければ、目的を果たさないので省略してください。クリーンアップを実行する必要がある場合は、 'try catch'ではなく' try finally'を使用してください。 – detaylor

+1

@kevin - 例外を元に戻す方法は分かりませんが(同じ例外を投げていると仮定します)、スタックを維持するために 'throw ex;'の代わりに 'throw; 'を使用する必要があります。初期例外がスローされました – detaylor

関連する問題