UncaughtExceptionHandler не перехватывает некоторые исключения

Я создал UncaughtExceptionHandler, как показано в этой статьи.

Я также зарегистрировал этот обработчик для перехвата исключений во всех потоках, например:

    Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());

Однако в нем отсутствуют некоторые исключения:

Exception occurred during event dispatching:
java.lang.RuntimeException: Critical error!
    at com.acme.MyClass.myMethod(MyClass.java:46)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
    at java.awt.EventQueue.access$000(EventQueue.java:84)
    at java.awt.EventQueue$1.run(EventQueue.java:602)
    at java.awt.EventQueue$1.run(EventQueue.java:600)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178)
    at java.awt.Dialog$1.run(Dialog.java:1046)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
    at java.awt.EventQueue.access$000(EventQueue.java:84)
    at java.awt.EventQueue$1.run(EventQueue.java:602)
    at java.awt.EventQueue$1.run(EventQueue.java:600)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
    at java.awt.EventQueue$2.run(EventQueue.java:616)
    at java.awt.EventQueue$2.run(EventQueue.java:614)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Почему отсутствуют такие исключения?


person Paul Reiners    schedule 07.02.2012    source источник
comment
Это очень похоже на то, что описано в учебнике, на который вы ссылаетесь... stuffthathappens.com/blog/2007/10/15/   -  person Brian Roach    schedule 07.02.2012
comment
Ваш обработчик ловит непроверенные исключения? Опубликуйте исходный код, пожалуйста.   -  person david a.    schedule 07.02.2012
comment
Конечно, это удивительно похоже на учебник. Я использую учебник, чтобы понять, как это сделать в моем собственном приложении!   -  person Paul Reiners    schedule 07.02.2012
comment
Я предполагаю, что это так. Я реализовал uncaughtException (последний поток t, окончательный Throwable e): public void uncaughtException (последний поток t, окончательный Throwable e) { if (SwingUtilities.isEventDispatchThread()) { showException (t, e); } else { SwingUtilities.invokeLater(new Runnable() { public void run() { showException(t, e); } }); } }   -  person Paul Reiners    schedule 07.02.2012
comment
Немного похоже на это: stackoverflow.com/questions/3171394/ . Вы пытались поместить обычную печать в обработчик?   -  person david a.    schedule 07.02.2012
comment
@PaulReiners - вы отображаете модальное диалоговое окно, когда это происходит?   -  person Brian Roach    schedule 07.02.2012


Ответы (2)


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

Также может быть, что этот поток принадлежит специальному ThreadGroup, который обрабатывает исключение, а не делегирует его обработчику по умолчанию.

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

person Philipp Wendler    schedule 07.02.2012

java.awt.EventDispatchThread#processException заботиться о sun.awt.exception.handler системном свойстве. Сообщается, что эта ошибка исправлена ​​в Java 7.

Для Java 6 у меня отлично работает:

import java.lang.Thread.UncaughtExceptionHandler;

import org.apache.log4j.Logger;

/**
 * @see java.awt.EventDispatchThread.processException
 * @see java.lang.Thread.dispatchUncaughtException
 * @see java.lang.ThreadGroup.uncaughtException
 * @author Mykhaylo Adamovych
 */
public class DefaultUncaughtExceptionHandler implements UncaughtExceptionHandler {
    public static final String SP_SUN_AWT_EXCEPTION_HANDLER = "sun.awt.exception.handler";
    static {
        if (Thread.getDefaultUncaughtExceptionHandler() == null)
            Thread.setDefaultUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler());
        if (System.getProperty(SP_SUN_AWT_EXCEPTION_HANDLER) == null)
            System.setProperty(SP_SUN_AWT_EXCEPTION_HANDLER, DefaultUncaughtExceptionHandler.class.getName());
    }

    public static void initialize() {
        // load class and perform initialization
    }

    public void handle(Throwable e) {
        uncaughtException(Thread.currentThread(), e);
    }

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        if (!(e instanceof ThreadDeath))
            Logger.getLogger(e.getStackTrace()[0].getClassName()).error("Exception in thread \"" + t.getName() + "\"", e);
    }
}
person Mike    schedule 06.02.2013