Как я могу поймать исключения потока AWT в Java? - PullRequest
18 голосов
/ 18 сентября 2008

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

Ответы [ 4 ]

12 голосов
/ 09 января 2015

Начиная с 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());
    }
});
10 голосов
/ 19 сентября 2008

Существует различие между необъяснимыми исключениями в 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())
  }
}
3 голосов
/ 20 сентября 2008

Небольшое дополнение к Шемнон с ответом:
В первый раз, когда в EDT возникает необработанное исключение RuntimeException (или Error), он ищет свойство «sun.awt.exception.handler» и пытается загрузить класс, связанный со свойством. Для EDT нужен класс Handler, чтобы иметь конструктор по умолчанию, иначе EDT не будет его использовать.
Если вам нужно внести немного больше динамики в историю обработки, вы вынуждены делать это с помощью статических операций, потому что класс создается в EDT и поэтому не имеет доступа к другим ресурсам, кроме static. Вот код обработчика исключений из используемой нами платформы 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);
    }

}

Надеюсь, это поможет.

0 голосов
/ 18 сентября 2008

Есть два способа:

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

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

-

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...