0

在 Microsoft 企业库的异常处理应用程序块的最新版本(4.1,2008 年 10 月发布)中,有两个 HandleException() 方法签名,我对这些的意图有点迷茫,特别是因为文档和智能感知都没有,QuickStart 应用程序也没有任何有意义的区别。

这是两个签名:

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 文档注释)是使用第二个的示例:

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

所以,我的问题是,使用第二个给你什么,而第一个没有?这对我来说应该是显而易见的,但我今天的脑袋一团糟,我真的不想再把头撞在众所周知的墙上了。:)

请不要猜测;我希望听到有人从使用它的经验中真正知道他们在说什么。

4

3 回答 3

3

如果您在企业库配置中使用替换处理程序,则您的替换异常将通过第二个签名返回 .. ,输出 Exception exceptionToThrow)。

于 2009-06-03T11:10:15.783 回答
3

两种方法重载的主要区别在于

bool HandleException(Exception exceptionToHandle, string policyName);

如果 PostHandlingAction 设置为 ThrowNewException,则会抛出异常。


而第二种方法重载:

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

在这种情况下不会抛出异常,而是返回异常作为输出参数重新抛出。

实际上,两个调用调用相同的核心代码,但第二个方法重载捕获抛出的异常并将其返回给调用者。

So the second overload gives you a bit more control since you could perform some additional logic before throwing. It also standardizes the API in the sense that if you use the second HandleException method with the out parameter Enterprise Library will never intentionally handle your exception and throw it for you. i.e. The first method sometimes throws and sometimes relies on you to rethrow (in the case of NotifyRethrow) but the second method always returns and lets the caller throw/rethrow.

于 2009-11-18T04:51:49.860 回答
0

我相信您不允许跨 WCF 服务边界抛出原始异常,这是一项安全功能(真正确保敏感的错误信息不会通过服务链传播)。因此,可以通过第二个参数 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 操作上设置了一个错误协定)可防止 WCF 服务在您的调用应用程序/服务中报告错误状态错误消息。

如果没有第二个签名,我将在 WCF 服务边界之间进行错误简化/传播。

谢谢,保罗。(修改代码 8/7/09 - John 的更正评论,谢谢)

于 2009-07-08T07:44:56.093 回答