0

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

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

我正在使用以下代码:

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

这样做的结果是一个异常,它被包装在我的自定义异常中并被抛出。这是干净和简单的,但由于我的代码从未看到包装异常实例,我无法用其他信息来扩充它。

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

4

2 回答 2

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);
于 2012-08-08T16:57:02.440 回答
0

我不确定您要添加什么样的附加信息,但如果您想保持 Process 方法的优雅,那么您可以创建一个自定义 WrapHandler ,将适当的信息添加到包装器异常中。一个不错的选择是将附加信息添加到 Exception.Data IDictionary。

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

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

于 2012-08-10T05:26:29.180 回答