Что касается нужного вам типа отладочной информации, почему бы вам просто не всегда записывать значение в журнал и не слишком беспокоиться о локальном try / catch. Просто используйте файл конфигурации Log4J, чтобы указать ваши сообщения отладки на другой журнал, или используйте бензопилу, чтобы вы могли удаленно следить за сообщениями журнала. Если все это терпит неудачу, возможно, вам нужен новый тип сообщения журнала, чтобы добавить его в debug () / info () / warn () / error () / fatal (), чтобы у вас был больший контроль над тем, какие сообщения отправляются куда. Это может быть в том случае, если определение аппендеров в файле конфигурации log4j нецелесообразно из-за большого количества мест, в которые необходимо вставить этот тип журнала отладки.
Пока мы обсуждаем эту тему, вы затронули одну из моих любимых мозолей. Создание нового исключения в блоке catch - это запах кода.
Catch(MyDBException eDB)
{
throw new UnhandledException("Something bad happened!", eDB);
}
Поместите сообщение в журнал и затем сбросьте исключение. Создание исключений стоит дорого и может легко скрыть полезную информацию отладки.
Прежде всего, неопытные программисты и те, кто любит вырезать-вставить-вставить (или begin-mark-bug, end-mark-bug, copy-bug, copy-bug, copy-bug), может легко трансформироваться в это :
Catch(MyDBException eDB)
{
throw new UnhandledException("Something bad happened!");
}
Теперь вы потеряли оригинальную трассировку стека. Даже в первом случае, если исключение обертки не обрабатывает обернутое исключение должным образом, вы все равно можете потерять сведения об исходном исключении, наиболее вероятна трассировка стека.
Повторное исключение может быть необходимым, но я обнаружил, что оно должно обрабатываться более широко и как стратегия для взаимодействия между уровнями, например, между вашим бизнес-кодом и уровнем персистентности, например:
Catch(SqlException eDB)
{
throw new UnhandledAppException("Something bad happened!", eDB);
}
и в этом случае блок catch для UnhandledAppException намного дальше вверх по стеку вызовов, где мы можем дать пользователю указание на то, что ему либо нужно повторить свое действие, сообщить об ошибке или что-то еще.
Это позволяет нашему коду main () делать что-то вроде этого
catch(UnhandledAppException uae)
{
\\notify user
\\log exception
}
catch(Throwable tExcp)
{
\\for all other unknown failures
\\log exception
}
finally
{
\\die gracefully
}
Выполнение этого способа означало, что локальный код мог перехватывать немедленные и восстанавливаемые исключения, при которых могли быть сделаны журналы отладки, и исключение не должно быть переброшено. Это будет похоже на DivideByZero или, может быть, какое-то исключение ParseException.
Что касается предложений «throws», то наличие стратегии исключений на основе уровня означало возможность ограничения числа типов исключений, которые должны быть перечислены для каждого метода.