Вы, вероятно, не хотите отправлять письма по любому исключению. В JDK много кода, который в действительности зависит от исключений для нормальной работы. Я полагаю, что вас больше не интересуют неисследованные исключения. Если вы ловите исключения, вы должны обрабатывать уведомления там.
В настольном приложении можно беспокоиться об этом в двух местах: в потоке событий (EDT) и вне EDT. Глобально вы можете зарегистрировать класс, реализующий java.util.Thread.UncaughtExceptionHandler
, и зарегистрировать его через java.util.Thread.setDefaultUncaughtExceptionHandler
. Это будет вызвано, если исключение сворачивается в конец стека, и поток не имеет обработчика, установленного в текущем экземпляре потока в потоке или в ThreadGroup.
EDT имеет другой хук для обработки исключений. Системное свойство 'sun.awt.exception.handler'
должно быть зарегистрировано с полным именем класса для класса с конструктором с нулевым аргументом. Этот класс нуждается в дескрипторе метода экземпляра (Throwable
), который выполняет вашу работу. Тип возвращаемого значения не имеет значения, и поскольку каждый раз создается новый экземпляр, не рассчитывайте на сохранение состояния.
Так что, если вам все равно, в каком потоке произошло исключение в образце, оно может выглядеть следующим образом:
class ExceptionHandler implements Thread.UncaughtExceptionHandler {
public void uncaughtException(Thread t, Throwable e) {
handle(e);
}
public void handle(Throwable throwable) {
try {
// insert your e-mail code here
} catch (Throwable t) {
// don't let the exception get thrown out, will cause infinite looping!
}
}
public static void registerExceptionHandler() {
Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler());
System.setProperty("sun.awt.exception.handler", ExceptionHandler.class.getName());
}
}
Добавьте этот класс в некоторый случайный пакет, а затем вызовите метод registerExceptionHandler
, и вы должны быть готовы к работе.