使用Wrap Handler添加其他异常信息

时间:2012-08-07 17:48:08

标签: exception-handling enterprise-library

Enterprise Library 5.0异常处理包括Wrap Handler。这会在另一个异常中包装异常并抛出包装器异常。

我想在我的包装器异常中添加其他信息,例如有关发生错误时生效的参数和设置的一些信息。这对于故障排除很方便(因为这个包装器异常将被更高级别的处理程序捕获并记录)。

我使用以下代码:

ExceptionManager em = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();
em.Process(() => { DoSomething(); }, "WrapPolicy");

这是一个异常,它被包装在我的自定义异常中并被抛出。这很简单,但由于我的代码永远不会看到包装器异常实例,所以我不能用附加信息来增加它。

除了将动作包装在传统的Try ... Catch并手动执行HandleException方法之外,有没有办法将其他信息注入包装器异常实例?

2 个答案:

答案 0 :(得分:0)

配置包装处理程序时,可以提供异常消息。

    var builder = new ConfigurationSourceBuilder();

    builder.ConfigureExceptionHandling()
               .GivenPolicyWithName("MyPolicy")
               .ForExceptionType<NullReferenceException>()
                 .WrapWith<InvalidOperationException>()
                   .UsingMessage(messageBasedOnSomeRuntimeInfo)
                 .ThenNotifyRethrow();

    var configSource = new DictionaryConfigurationSource();
    builder.UpdateConfigurationWithReplace(configSource);
    EnterpriseLibraryContainer.Current 
          = EnterpriseLibraryContainer.CreateDefaultContainer(configSource);

答案 1 :(得分:0)

我不确定您要添加哪些附加信息但是如果您想要保持Process方法的优雅,那么您可以创建一个自定义WrapHandler,它将相应的信息添加到包装器异常中。一个好的候选者是将附加信息添加到Exception.Data IDictionary。

如果您正在寻找方法参数,那么可能唯一的方法是创建您自己的“上下文”,在其中设置值,并从上下文中提取它们以添加到包装异常。

另一种更优雅的方法是使用Policy Injection。调用处理程序可以访问方法参数以及抛出的异常。您可以修改现有的ExceptionCallHandler,将您的信息添加到原始或新的异常中。如果将上下文信息添加到原始异常中,那么该信息将由异常策略处理(可能包括日志记录)。