Пользовательское исключение.Где это войти - PullRequest
1 голос
/ 03 октября 2011

Я создал CustomExceptionClass, что его сообщения взяты из файла конфигурации и являются более дружественным сообщением для пользователя.

Затем я хочу войти в систему, если было сгенерировано исключение, потому что, если что-то пошло не так, я хочу узнать подробности, тогда я могу это исправить. Итак, у меня есть сомнения.

Где регистрировать эти исключения, используя log4j? Внутри CustomExceptionClass, или я позволю методу, который выдает это исключение, регистрировать его?

Ответы [ 4 ]

3 голосов
/ 03 октября 2011

Вы должны регистрироваться везде, где вы ловите Исключение. Если вы его нигде не поймаете, это действительно зависит от того, как вы запускаете свое приложение.

3 голосов
/ 03 октября 2011

Я не уверен, если у вас есть вопрос о log4j, в частности, но этот API просто требует, чтобы что-то вызывало log.error(Object,Throwable), передавая сообщение в качестве первого параметра и ошибку в качестве второго параметра. (log это, конечно, ссылка на регистратор Log4J.)

Относительно вопроса, куда звонить log.error, не звоните log.error из вашего CustomExceptionClass подкласса Throwable. Вместо этого я бы принял следующее решение:

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

Точно так же, если вы хотите записать что-то конкретное, независимо от того, было ли исключение обнаружено или каким образом, то, очевидно, вам нужно сделать это перед тем, как выбросить исключение. Вы относительно мало контролируете, кто вызывает не приватный метод.

В противном случае войдите в блок catch. Это позволяет отслеживать как то, что произошло, так и то, как ваше приложение отреагировало в результате. Если у вас есть только первая часть информации, то другие люди должны будут прочитать код, чтобы понять «и что?»

Наконец, считается хорошей практикой использовать необработанные обработчики исключений для всех потоков. Смотрите Thread.UncaughtExceptionHandler для более подробной информации. По сути, вы действительно хотите регистрировать все исключения в долго работающих приложениях.

2 голосов
/ 03 октября 2011

Вы должны регистрировать его в коде обработки ошибок, а не в том месте, где изначально создавалась ошибка.

1 голос
/ 03 октября 2011

Я обычно перегружаю ToString и / или GetMessage в пользовательских исключениях и просто регистрирую их в обычном режиме.

...