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




Есть два пути:
Я не знаю, работает ли последний на jvms, отличных от SUN.
-
Действительно, первое неверно, это всего лишь механизм обнаружения сбойного потока.
Вам также не хватает сведений о том, что необходимо во втором варианте, класс MyExceptionHandler должен иметь доступный метод экземпляра дескриптора (Throwable) и конструктор без аргументов.
Существует различие между неперехваченными исключениями в EDT и за пределами EDT.
Другой вопрос имеет решение как для, но если вы хотите пережевывать только часть EDT ...
class AWTExceptionHandler {
public void handle(Throwable t) {
try {
// insert your exception handling code here
// or do nothing to make it go away
} catch (Throwable t) {
// don't let the exception get thrown out, will cause infinite looping!
}
}
public static void registerExceptionHandler() {
System.setProperty('sun.awt.exception.handler', AWTExceptionHandler.class.getName())
}
}
Не нужно ловить метательные. Бесконечного цикла не будет. java.awt.EventDispatchThread.handleException перехватывает любые исключения за вас.
Там сказано classs AWTExceptionHandler
Небольшое дополнение к Шемнонs ответ:
В первый раз, когда в EDT возникает неперехваченное исключение RuntimeException (или ошибка), он ищет свойство «sun.awt.exception.handler» и пытается загрузить класс, связанный со свойством. EDT требует, чтобы класс Handler имел конструктор по умолчанию, иначе EDT не будет его использовать.
Если вам нужно внести немного больше динамики в историю обработки, вы вынуждены делать это со статическими операциями, потому что класс создается EDT и, следовательно, не имеет возможности получить доступ к другим ресурсам, кроме статических. Вот код обработчика исключений из нашего фреймворка Swing, который мы используем. Он был написан для Java 1.4 и там отлично работал:
public class AwtExceptionHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(AwtExceptionHandler.class);
private static List exceptionHandlerList = new LinkedList();
/**
* WARNING: Don't change the signature of this method!
*/
public void handle(Throwable throwable) {
if (exceptionHandlerList.isEmpty()) {
LOGGER.error("Uncatched Throwable detected", throwable);
} else {
delegate(new ExceptionEvent(throwable));
}
}
private void delegate(ExceptionEvent event) {
for (Iterator handlerIterator = exceptionHandlerList.iterator(); handlerIterator.hasNext();) {
IExceptionHandler handler = (IExceptionHandler) handlerIterator.next();
try {
handler.handleException(event);
if (event.isConsumed()) {
break;
}
} catch (Throwable e) {
LOGGER.error("Error while running exception handler: " + handler, e);
}
}
}
public static void addErrorHandler(IExceptionHandler exceptionHandler) {
exceptionHandlerList.add(exceptionHandler);
}
public static void removeErrorHandler(IExceptionHandler exceptionHandler) {
exceptionHandlerList.remove(exceptionHandler);
}
}
Надеюсь, это поможет.
Начиная с Java 7, вам нужно делать это по-другому, поскольку взлом sun.awt.exception.handler больше не работает.
Вот решение (из Неперехваченные исключения AWT в Java 7).
// Regular Exception
Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler());
// EDT Exception
SwingUtilities.invokeAndWait(new Runnable()
{
public void run()
{
// We are in the event dispatching thread
Thread.currentThread().setUncaughtExceptionHandler(new ExceptionHandler());
}
});
Согласно источнику, который вы связали, нет необходимости устанавливать UncaughtExceptionHandler специально для EDT, если он такой же, как UncaughtExceptionHandler по умолчанию для всех потоков.
Мой пример не очень реалистичен (тот же UncaughtExceptionHandler), дело в том, что вы можете установить конкретный UncaughtExceptionHandler только для EDT
Но да, вы также можете один раз установить обработчик по умолчанию и управлять исключением здесь (независимо от того, находитесь ли вы в EDT или нет)
Что бы вы сделали, если бы запустили новый EDT, например, для модального диалога? Есть ли способ получить уведомление об этом?
Я не большой специалист по AWT, но возможно ли использовать более одного EDT?
Это необходимо для модальных диалогов, потому что если вы открываете модальное диалоговое окно из основного EDT, вы должны приостановить его, чтобы он мог продолжаться после оператора, открывшего диалоговое окно, но внутри диалогового окна вам понадобится цикл событий. Следовательно, вам нужно начать новый на время диалога. Конечно, только один EDT будет «запущен», потому что другой приостановлен, но это разные потоки.
Использование Thread.UncaufhtExceptionHandler не будет перехватывать исключения EDT. Класс EDT ловит все бросаемые предметы и распечатывает их, а не позволяет им раскрутить весь поток.