Как я могу поймать исключения потока AWT в Java?

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
18
0
6 447
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Есть два пути:

  1. / * Устанавливаем Thread.UncaughtExceptionHandler в EDT * /
  2. Установите системное свойство: System.setProperty ("sun.awt.exception.handler", MyExceptionHandler.class.getName ());

Я не знаю, работает ли последний на jvms, отличных от SUN.

-

Действительно, первое неверно, это всего лишь механизм обнаружения сбойного потока.

Использование Thread.UncaufhtExceptionHandler не будет перехватывать исключения EDT. Класс EDT ловит все бросаемые предметы и распечатывает их, а не позволяет им раскрутить весь поток.

shemnon 19.09.2008 01:30

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

shemnon 19.09.2008 01:31
Ответ принят как подходящий

Существует различие между неперехваченными исключениями в 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 перехватывает любые исключения за вас.

Mike 11.11.2011 11:11

Там сказано classs AWTExceptionHandler

Jaime Hablutzel 10.03.2014 02:38

Небольшое дополнение к Шемнон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 по умолчанию для всех потоков.

Benjamin Berger 01.08.2018 11:03

Мой пример не очень реалистичен (тот же UncaughtExceptionHandler), дело в том, что вы можете установить конкретный UncaughtExceptionHandler только для EDT

ToYonos 02.08.2018 10:32

Но да, вы также можете один раз установить обработчик по умолчанию и управлять исключением здесь (независимо от того, находитесь ли вы в EDT или нет)

ToYonos 02.08.2018 10:39

Что бы вы сделали, если бы запустили новый EDT, например, для модального диалога? Есть ли способ получить уведомление об этом?

Benjamin Berger 03.08.2018 14:33

Я не большой специалист по AWT, но возможно ли использовать более одного EDT?

ToYonos 03.08.2018 18:02

Это необходимо для модальных диалогов, потому что если вы открываете модальное диалоговое окно из основного EDT, вы должны приостановить его, чтобы он мог продолжаться после оператора, открывшего диалоговое окно, но внутри диалогового окна вам понадобится цикл событий. Следовательно, вам нужно начать новый на время диалога. Конечно, только один EDT будет «запущен», потому что другой приостановлен, но это разные потоки.

Benjamin Berger 04.08.2018 18:13

Другие вопросы по теме