Избегайте регистрации одного и того же исключения

Я использую 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;
    }
}

Этот пример правомерен. MethodB может быть вызван из какого-то другого контекста, а не из MethodA. Просто так получилось, что в этом случае он вызывается из MethodA, а сам метод имеет блок обработки исключений. Как вы можете видеть, это дважды регистрировало мое исключение.

Единственное решение, которое я придумала, это иметь коллекцию сгенерированных исключений внутри ExceptionLoggingHandler для отслеживания зарегистрированных исключений. Таким образом, я бы регистрировал одно исключение только один раз. Проблема с этим решением состоит в том, что я не знаю, когда удалить исключение.

0 ответов

Другие вопросы по тегам