例外をキャッチする場所
質問
WCF SVCは、サービスレイヤー、ビジネスロジックレイヤー、データアクセスレイヤーに分離されています。
私のDALが例外に出会ったら、そこでそれを捕まえるか、それをサービスレイヤーにバブルに戻させるべきですか?なぜ?
このシナリオのクライアントの関与を無視してください。私はWCF SVCの例外を記録することのみに関心があります。
解決
また、ソリューションをどのようにアーキテクテクティブしているかにも依存します。たとえば、DALレイヤーとBLLレイヤーが完全に独立したコンポーネントであることを意図している場合、誰がそれらを呼んでいるかについて仮定することはできません。そのため、コンポーネントの境界で例外をキャッチし、それらの例外を記録し、例外を伝播させる必要があります。彼らは、レイヤー固有の例外で一般的な例外をラップしたいかもしれません。
catch (Exception ex)
{
Logger.Log(ex);
throw new DalException("Unhandled exception in DAL", ex);
}
もし、あんたが 知る これらはアプリケーション全体の一部としてのみ使用されます。その後、ログを最も外側のレイヤーに延期できます。例外をキャッチしない場合、例外は記録されないレイヤーです。
他のヒント
そのための用語があります - 例外シールド。基本的に、システムの例外がより高いレベルに移動するのを防ぐ必要があります。これにより、Atackerがシステムアーキテクチャのビューを提供する可能性があるためです。 WCF例外シールドは、特定のタイプの例外をキャッチし、他のタイプの例外に置き換えることができます。たとえば、StackOverFlowの例外をキャッチし、カスタムSystemExceptionに置き換えることができます。エンタープライズライブラリを使用する場合、交換されたときにこれらの例外を記録するように設定することもできます
それは、サービスがどのように消費され、誰(もし誰かが)が例外が発生したときに意識したい人(誰かが)に依存すると思います。
たとえば、ミッションクリティカルな内部ビジネスアプリケーションを開発している場合は、エンドユーザーが開発者に連絡して迅速に連絡できるように、アプリケーションを消費するユーザーインターフェイスにサービスレイヤーを介してバブルを介して例外の詳細を提供することができます。問題を解決します。
ただし、サービスがパブリックWebページで消費されているとしましょう。おそらく、サービスレイヤーが何らかの方法でエラーをキャッチすることを望んでいますが、最小限の情報をエンドクライアントに渡し、エンドユーザーに一般的なエラーメッセージを提供し、例外の詳細をエラーログに記述することを選択できます。レビューする開発者。
最終的に、私はまだあなたが例外をサービスレイヤーまでバブルアップすることを望んでいると思いますが、例外を処理し、エンドクライアントに渡す情報を決定する方法はあなた次第です。
私は通常、一般的なエラーハンドラーを使用します(System.ServiceModel.Dispatcher.IErrorHandler
実装)これは、構成ファイルのServiceBehaviorによってWebサービスに添付されています。
IErrorHandler.ProvideFault
メソッドは、サービスからスローされた例外を傍受します。
それらを記録します。
as-isを介してfaultexceptionsを渡します。
faultコード「送信者/クライアント」を使用して、BLLによってスローされた「ビジネスルール違反)をfaultExceptionsに変換します。
技術的な例外(例えば、DALによってスローされた)を障害コード「受信者/サーバー」で断層エクセプションに変換します。
このようにして、サービスコード自体にはビジネスコードのみが含まれており、例外をキャッチする必要はありません。