0

WCF アプリケーションに適切な例外処理を実装することに関心があります。グーグルで簡単に調べた後、2つのソリューションに出くわしました。

  1. クライアントに提供FaultExceptionsします。
  2. を使用した一般的な例外処理IErrorHandler

しかし、私が見つけられなかったのは、2 つの方法を組み合わせた実用的な例でし

私の考え:

独自の詳細タイプで FaultException をスローする

throw new FaultException<StackOverflowFault>(
    new StackOverflowFault(StackOverflowFaultCode.Rules,
        "This question is not considered as constructive."));

未処理の例外をキャッチしIErrorHandlerてログに記録します。

public bool HandleError(Exception ex) {
    try {
        SomeLogger.Error(ex.Message, ex.Source);
        return true;
    } catch (Exception) {
        // Well, there was an exception handling the
        // exception :(
        // -> Drop the exception and throw a new one
        throw new Exception("Unknown exception occured.");
    }
}

...そして、例外の種類に基づいて障害を提供します

(全てがお客様目線ではありません!)

public void ProvideFault(Exception error, MessageVersion version, ref Message fault){
    if(error is FaultException) {
        fault = Message.CreateMessage(version, ((FaultException<StackOverflowFault>)error).Reason)
    } else if(error is SqlException) {
        // What would Jon Skeet do?
    }   
}

私の質問

これはオーケープラクティスとみなされますか? そして:クライアントに適したアプリケーションですでにFaultExceptionをスローしている場合-それらを処理させるのは理にかなっていますかIErrorHandler自動的に処理します)?

4

1 に答える 1

1

ベスト プラクティスは、IErrorHandler を実装することです。それの訳は:

  1. 潜在的な例外の原因はコードだけではありません。呼び出すメソッド (またはバグ) により、.NET 例外が発生する場合があります。その例外をどこかで処理せず、IncludeExceptionDetailInFaultsを使用していない場合(本番環境では使用しないでください)、これはサービス クラッシュのように見えます。
  2. 懸念事項の分離: サービス コードによって呼び出されるビジネス レイヤーは、WCF ( System.ServiceModel) を参照してはならず、標準の .NET 例外をスローする必要があります。ホステッドがどのように移植性とテスト性を高めているかをビジネス レイヤーが認識しないようにします。
  3. [ FaultContract] タイプは [ ] で指定する必要がありますOperationContract。大規模なアプリケーションでは、Fault 生成を集中化する必要があります。つまり、特定の IErrorHandler が特定の一連の Fault を返すことを知っているため、Contracts Faults タイプが正しいことを検証できます。コントラクトのメソッドが明示的にサポートしていない Fault タイプをスローすると、厄介なランタイム エラーが発生します。

すべてのサービス メソッドで try/catch ブロックをコピー アンド ペーストして、FaultException をスローすることもできますが、これは恐ろしいコードの匂いであり、IErrorHandler が動作として提供している正確な機能です。そのため、代わりに IErrorHandler を使用してください。

2つのモデルを組み合わせることが可能です。たとえば、必要に応じて IErrorHandler に FaultException を処理させますが、これは一般的な方法ではありません。

于 2013-06-12T19:09:40.723 に答える