我正在使用Microsoft.Practices.EnterpriseLibrary.ExceptionHandling来处理应用程序中的异常。
我有一个处理程序,可以在我们的自定义日志记录类中记录异常。此处理程序是异常策略定义的一部分,将NotifyRethrow作为PostHandlingAction。
这是记录异常的处理程序
[ConfigurationElementType(typeof(CustomHandlerData))]
public class ExceptionLoggingHandler : IExceptionHandler
{
public Exception HandleException(Exception exception, Guid handlingInstanceId)
{
Log.Write(exception);
return exception;
}
}
这是我的例外政策定义
var throwAndLogPolicy = new ExceptionPolicyDefinition(PolicyType.LogAndThrow, new List<ExceptionPolicyEntry>()
{
new ExceptionPolicyEntry(
typeof(Exception),
PostHandlingAction.NotifyRethrow,
new IExceptionHandler[]
{
new ExceptionLoggingHandler()
})
});
我想避免使用此处理程序两次记录相同的excpetion。这是否可以使用ExceptionHandling应用程序块。
假设我们有一个调用MethodB的MethodA,而MethodB又会抛出一个excpetion。
public void MethodA()
{
try
{
MethodB();
}
catch(Exception ex)
{
if(ExceptionPolicy.HandleException(ex, "LogAndRethrow"))
throw;
}
}
public void MethodB()
{
try
{
CallCodeThatThrowsAnException();
}
catch(Exception ex)
{
if(ExceptionPolicy.HandleException(ex, "LogAndRethrow"))
throw;
}
}
这个例子是合法的。可以从其他上下文而不是MethodA调用MethodB。恰好在这种情况下,它从MethodA调用,并且该方法本身具有异常处理块。如您所见,这会将我的异常记录两次。
我提出的唯一解决方案是在ExceptionLoggingHandler中包含一组抛出的异常,以跟踪记录的异常。这样我只会记录一次异常。这个解决方案的问题是我不知道何时删除该删除。