代码之家  ›  专栏  ›  技术社区  ›  Jason Bunting

异常处理应用程序块(Ent Lib 4.1)的两个HandleException()方法之间的本质区别是什么

  •  0
  • Jason Bunting  · 技术社区  · 16 年前

    以下是两个签名:

    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;
    }
    

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

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

    请不要投机;我希望听到有人真正知道他们在说什么,从使用这个经验。

    3 回复  |  直到 16 年前
        1
  •  3
  •   Paul Berry    15 年前

        2
  •  3
  •   Randy Levy    15 年前

    bool HandleException(Exception exceptionToHandle, string policyName);
    


    而第二种方法:

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

    在这种情况下不会抛出异常,而是返回要作为out参数重试的异常。

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

    因此,第二个重载为您提供了更多的控制,因为您可以在抛出之前执行一些额外的逻辑。它还标准化了API,如果您使用带有out参数的second-HandleException方法,Enterprise Library将永远不会故意处理异常并为您抛出它。i、 e.第一个方法有时抛出,有时依赖于您重新抛出(在NotifyRethrow的情况下),但第二个方法总是返回,并允许调用方抛出/重新抛出。

        3
  •  0
  •   Paul Berry    15 年前

    我相信您不允许跨越WCF服务边界抛出原始异常,这是一个安全特性(实际上是为了确保敏感错误信息不会通过服务链传播)。因此,可以通过第二个参数out exceptionToThrow(out exceptionToThrow)创建并传入新的执行选项,并通过您的配置(enterprise library replace Exception)提供特定的异常消息和类型。其中一个例子是:

                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);
                    }
                }
    

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