Проблема не в локальном блоке перехвата, проблема в журнале и перебрасывании . Либо обработайте исключение, либо заключите его в новое исключение, которое добавляет дополнительный контекст, и выбросьте его. В противном случае вы столкнетесь с несколькими дублирующимися записями журнала для одного и того же исключения.
Идея заключается в том, чтобы расширить возможности отладки вашего приложения.
Пример № 1: справиться с этим
try
{
doSomething();
}
catch (Exception e)
{
log.Info("Couldn't do something", e);
doSomethingElse();
}
Если вы обработаете исключение, вы можете легко понизить важность записи в журнале исключений, и нет никаких причин фильтровать это исключение в цепочке. С этим уже разобрались.
Обработка исключения может включать информирование пользователей о возникшей проблеме, регистрацию события или просто его игнорирование.
ПРИМЕЧАНИЕ: если вы намеренно игнорируете исключение, я рекомендую предоставить комментарий в пустом предложении catch, в котором четко указано, почему. Это позволяет будущим сопровождающим знать, что это не было ошибкой или ленивым программированием. Пример:
try
{
context.DrawLine(x1,y1, x2,y2);
}
catch (OutOfMemoryException)
{
// WinForms throws OutOfMemory if the figure you are attempting to
// draw takes up less than one pixel (true story)
}
Пример № 2: Добавить дополнительный контекст и бросить
try
{
doSomething(line);
}
catch (Exception e)
{
throw new MyApplicationException(filename, line, e);
}
Добавление дополнительного контекста (например, номера строки и имени файла в коде синтаксического анализа) может помочь улучшить возможность отладки входных файлов - при условии, что проблема существует. Это особый случай, поэтому повторная упаковка исключения в «ApplicationException» только для того, чтобы переименовать его, не поможет вам отладить. Убедитесь, что вы добавили дополнительную информацию.
Пример № 3: ничего не делать, за исключением
try
{
doSomething();
}
finally
{
// cleanup resources but let the exception percolate
}
В этом последнем случае вы просто оставляете исключение, не касаясь его. Обработчик исключений на самом внешнем уровне может обрабатывать регистрацию. Это finally
предложение используется для того, чтобы убедиться, что все ресурсы, необходимые для вашего метода, очищены, но это не место для регистрации того, что было сгенерировано исключение.