Я не уверен, если у вас есть вопрос о log4j, в частности, но этот API просто требует, чтобы что-то вызывало log.error(Object,Throwable)
, передавая сообщение в качестве первого параметра и ошибку в качестве второго параметра. (log
это, конечно, ссылка на регистратор Log4J.)
Относительно вопроса, куда звонить log.error
, не звоните log.error
из вашего CustomExceptionClass
подкласса Throwable
. Вместо этого я бы принял следующее решение:
Если вы хотите записать подробности о том, что именно произошло, но не планируете помещать эти подробности в свой подкласс Исключения, то запишите подробности, прежде чем выдать ошибку.
Точно так же, если вы хотите записать что-то конкретное, независимо от того, было ли исключение обнаружено или каким образом, то, очевидно, вам нужно сделать это перед тем, как выбросить исключение. Вы относительно мало контролируете, кто вызывает не приватный метод.
В противном случае войдите в блок catch. Это позволяет отслеживать как то, что произошло, так и то, как ваше приложение отреагировало в результате. Если у вас есть только первая часть информации, то другие люди должны будут прочитать код, чтобы понять «и что?»
Наконец, считается хорошей практикой использовать необработанные обработчики исключений для всех потоков. Смотрите Thread.UncaughtExceptionHandler
для более подробной информации. По сути, вы действительно хотите регистрировать все исключения в долго работающих приложениях.