Зачем беспокоиться о настройке свойства "sun.awt.exception.handler"? - PullRequest
8 голосов
/ 26 апреля 2011

Вот некоторый код, который перехватывает исключение, генерируемое в потоке отправки событий:

package com.ndh.swingjunk;

import java.awt.EventQueue;

import javax.swing.JFrame;

public class EntryPoint {

    public static void main(String[] args) {
        Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());
//      System.setProperty("sun.awt.exception.handler", MyExceptionHandler.class.getName());

        EventQueue.invokeLater(new Runnable() 
        {
            public void run() 
            {
                new SomeWindow("foo").setVisible(true);
            }
        });
    }
}

class SomeWindow extends JFrame {
    public SomeWindow(String title) {
        this.setTitle(title);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        throw new RuntimeException("hello");
    }
}

Я видел предупреждения о том, что исключения, выдаваемые в потоке диспетчеризации событий, не обрабатываются UncaughtExceptionHandler, но в моем примере это не так; это работает одинаково, независимо от того, закомментирована ли строка регистрации или оставлена ​​в ней. Мой пример как-то испорчен, или регистрация обработчика исключений с sun.awt.exception.handler больше не нужна?

Ответы [ 2 ]

15 голосов
/ 27 апреля 2011

Класс EDT (java.awt.EventDispatchThread, не ищите его в javadoc, этот класс package private ) сильно изменился с момента появления AWT.

В JDK6 вы можете видеть, что этот класс теперь может правильно обрабатывать исключения, возникающие внутри EDT.Обработка исключений немного сложна в текущей версии:

  • , если вы установили свойство sun.awt.exception.handler, то ваш обработчик будет вызываться для каждого исключения, создаваемого кодом разработчика, вызываемым внутри EDT (совместимость спредыдущие версии JDK гарантированы).
  • в противном случае любое исключение будет повторно отправлено , следовательно, остановит текущий EDT, и любой UncaughtExceptionHandler по умолчанию сможет его перехватить, как ваш фрагмент

НО (а это очень важно ), если вы внимательно посмотрите код EDT, вы увидите, что этот механизм выигралне работает, если исключение возникает в EDT , когда отображается модальное диалоговое окно (я полагаю, это потому, что управление EDT и EventQueue довольно сложное, и я бы даже осмелился сказать " грязный * 1030"* ": большая часть кода выглядит там как хаки).

В этой конкретной ситуации исключения будут записываться в System.err, кроме случаев, когда вы установили свойство sun.awt.exception.handler.Значение по умолчанию UncaughtExceptionHandler не поможет.

Так что я считаю, что ДА, вы все равно должны беспокоиться о sun.awt.exception.handler свойстве , за исключением случаев, когда вы можете точно сказать, чтоваше приложение не использует модальные диалоги (не забывайте, что JOptionPane диалоги также являются модальными).

2 голосов
/ 26 апреля 2011

Вы позвонили setDefaultUncaughtExceptionHandler вместо setUncaughtExceptionHandler.(Если присутствует SecurityManager: для первого требуется RuntimePermission setDefaultUncaughtExceptionHandler; для последнего - SecurityManager.checkAccess(Thread).)

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