0

我正在使用 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()
        })                
});

我想避免使用此处理程序两次记录相同的异常。这可能与 ExceptionHandling 应用程序块。

假设我们有一个 MethodA 调用 MethodB 反过来抛出一个异常。

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 中收集抛出的异常,以跟踪记录的异常。这样我只会记录一次异常。此解决方案的问题是我不知道何时删除异常。

4

0 回答 0