Избегайте регистрации одного и того же исключения
Я использую 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 для отслеживания зарегистрированных исключений. Таким образом, я бы регистрировал одно исключение только один раз. Проблема с этим решением состоит в том, что я не знаю, когда удалить исключение.