Enterprise Library 5.0异常处理包括Wrap Handler。这会在另一个异常中包装异常并抛出包装器异常。
我想在我的包装器异常中添加其他信息,例如有关发生错误时生效的参数和设置的一些信息。这对于故障排除很方便(因为这个包装器异常将被更高级别的处理程序捕获并记录)。
我使用以下代码:
ExceptionManager em = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();
em.Process(() => { DoSomething(); }, "WrapPolicy");
这是一个异常,它被包装在我的自定义异常中并被抛出。这很简单,但由于我的代码永远不会看到包装器异常实例,所以我不能用附加信息来增加它。
除了将动作包装在传统的Try ... Catch并手动执行HandleException方法之外,有没有办法将其他信息注入包装器异常实例?
答案 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,将您的信息添加到原始或新的异常中。如果将上下文信息添加到原始异常中,那么该信息将由异常策略处理(可能包括日志记录)。