Пользовательская печать исключений Java при выдаче - PullRequest
0 голосов
/ 17 декабря 2009

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

Ответы [ 5 ]

3 голосов
/ 17 декабря 2009

Ваши пользовательские исключения могут наследоваться от RuntimeException, а затем установить UncaughtExceptionHandler в соответствующих потоках, чтобы искать ваши исключения и обрабатывать их, как вам нравится.

3 голосов
/ 17 декабря 2009

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

1 голос
/ 17 декабря 2009

Есть ли способ, который я могу переопределить для достижения этой цели?

Да, метод printStacktrace().

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

Вы можете использовать Logger, и этот конкретный регистратор будет указывать на файл, который вы хотите (и изменять его, отключать его, повторно включать и т. Д., Когда вам нужно)

Что-то вроде:

class MyStackTrace extends Throwable {
     public void printStacktrace() {
         super.printStracTrace();
         internalPrint();
     }
     private void internalPrint() {
         StringWriter sw = new StringWriter();
         printStackTrace( sw );
         Logger logger = Logger.getLogger("exceptions");
         logger.warning( sw.toString() );
     }
 }
0 голосов
/ 17 декабря 2009

В общем, это не очень хорошая идея, чтобы войти в каждое создание исключения. Ловец должен действительно решить, что является лучшей обработкой исключения. Кроме того, переопределение метода в исключении и запись в файл нарушает общий договор об исключении.

Кроме того, на более поздней стадии вы можете обнаружить ужасную проблему с производительностью, связанную с ведением журнала. Если переопределение происходит в центральном месте, вам будет трудно это исправить.

Если вы все еще хотите войти в систему, создавая исключение, то лучшим решением будет использование / создание класса утилит, например Throwables. Вызовите код как Throwables.logAndThrow (new CustomerException (...)), то же самое в одной строке кода, но гибкий на длительный срок. logAndThrow может быть таким же простым, как и при использовании техники логгера предыдущего постера:

public static void logAndThrow (Throwable t) { logger.warning (т); бросить т; }

0 голосов
/ 17 декабря 2009

Я не могу помочь вам распечатать трассировку стека при возникновении исключения. Но это достаточно легко сделать при создании исключения - просто включите printStackTrace() в конструктор вашего пользовательского исключения.

...