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

Я имею в виду использование функции axis () для замены значений «на» оси X.

18
задан Nicolas Simonet 18 September 2008 в 19:04
поделиться

3 ответа

Существует различие между неперехваченными исключениями в 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())
  }
}
10
ответ дан 30 November 2019 в 08:33
поделиться

Немного дополнения к shemnon с anwer:
В первый раз, когда непойманный RuntimeException (или Ошибка) происходит в EDT, он ищет свойство "sun.awt.exception.handler" и пытается загрузить класс, связанный со свойством. EDT нужен класс Обработчика, чтобы иметь конструктора по умолчанию, иначе 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);
    }

}

Hope это помогает.

3
ответ дан 30 November 2019 в 08:33
поделиться

Существует два пути:

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

я не знаю если последние работы над не-Sun jvms.

-

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

0
ответ дан 30 November 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: