0

The Microsoft Enterprise Library の Exception Handling Application Block の最新バージョン (4.1、2008 年 10 月リリース) には、2 つの HandleException() メソッド シグネチャがあり、これらの意図が少しわかりません。も、QuickStart アプリも意味のある違いを暗示していません。

以下に 2 つの署名を示します。

bool HandleException(Exception exceptionToHandle, string policyName);

bool HandleException(Exception exceptionToHandle, string policyName, out Exception exceptionToThrow);

私が見つけたすべての例は、最初の例を使用しています。この例では、実際のメソッドに関する XML ドキュメントのコメントから直接引用しています。

try
{
   Foo();
}
catch (Exception e)
{
   if (ExceptionPolicy.HandleException(e, name)) throw;
}

同じソース (メソッドの XML ドキュメント コメント) から、2 番目の使用例を次に示します。

try
{
   Foo();
}
catch (Exception e)
{
   Exception exceptionToThrow;
   if (ExceptionPolicy.HandleException(e, name, out exceptionToThrow))
   {
      if(exceptionToThrow == null)
         throw;
      else
         throw exceptionToThrow;
   }
}

ですから、私の質問は、最初のものでは得られないもので、2 番目のものを使用すると何が得られるのでしょうか? これはおそらく私には明らかなはずですが、今日の私の頭は混乱しており、ことわざの壁に頭をぶつけ続けたくありません. :)

憶測はご遠慮ください。これを使用した経験から、彼らが何を話しているのかを実際に知っている人からの連絡をお待ちしています.

4

3 に答える 3

3

エンタープライズライブラリ構成で置換ハンドラーを使用する場合、置換例外は2番目の署名(..、out Exception exceptionToThrow)を使用して返されます。

于 2009-06-03T11:10:15.783 に答える
3

2 つのメソッド オーバーロードの主な違いは、

bool HandleException(Exception exceptionToHandle, string policyName);

PostHandlingAction が ThrowNewException に設定されている場合、例外がスローされます。


一方、2 番目のメソッドのオーバーロードは次のとおりです。

bool HandleException(Exception exceptionToHandle, string policyName, out Exception exceptionToThrow);

その場合、例外はスローされませんが、代わりに out パラメーターとして再スローされる例外が返されます。

実際には、どちらの呼び出しも同じコア コードを呼び出しますが、2 番目のメソッド オーバーロードはスローされた Exception をキャッチし、それを呼び出し元に返します。

したがって、2 番目のオーバーロードでは、スローする前に追加のロジックを実行できるため、もう少し制御できます。また、out パラメータを指定して 2 番目の HandleException メソッドを使用すると、Enterprise Library が意図的に例外を処理してスローすることはないという意味で API を標準化します。つまり、最初のメソッドはスローすることもあれば、(NotifyRethrow の場合) 再スローをユーザーに依存することもありますが、2 番目のメソッドは常に戻り、呼び出し元にスロー/再スローさせます。

于 2009-11-18T04:51:49.860 に答える
0

WCFサービスの境界を越えて元の例外をスローすることは許可されていないと思います。これはセキュリティ機能です(機密性の高いエラー情報がサービスチェーン全体に伝播されないようにするためです)。したがって、新しいexecptionを作成し、2番目のパラメーターout Exception exceptionToThrowを介して渡すことができ、構成を使用して特定の例外メッセージとタイプを指定できます(エンタープライズライブラリ置換例外)。その一例は次のとおりです。

            try
            {
                throw new InvalidCastException();
            }
            catch (InvalidCastException ex)
            {
                Exception ex1;
                bool rethrow = ExceptionPolicy.HandleException(ex, "ReplacePolicy1", out ex1);

                if (rethrow)
                {
                    throw new FaultException<ApplicationException>((ApplicationException)ex1, ex1.Message);
                }
            }

FaultExceptionをスローすると(WCF操作でFaultコントラクトが設定されている場合)、WCFサービスが呼び出し元のアプリケーション/サービスで障害状態のエラーメッセージを報告するのを防ぎます。

2番目の署名がないと、WCFサービスの境界を越えたエラーの単純化/伝播に苦労します。

ありがとう、ポール。(コード8/7/09に変更-ジョンからの訂正コメント、ありがとう)

于 2009-07-08T07:44:56.093 に答える