2012-02-07 4 views
2

Я создал UncaughtExceptionHandler, как показано на картинке this article.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) 

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

+0

Это выглядит удивительно похожа на вещь в учебнике ссылке на ... Http://stuffthathappens.com/blog/2007/10/15/one-more-note-on-uncaught-exception-handlers/ –

+0

Выполняет ли ваш обработчик исключенные исключения? Отправьте его исходный код, пожалуйста. –

+0

Конечно, это очень похоже на учебник. Я использую учебник, чтобы выяснить, как это сделать в моем собственном приложении! –

ответ

1

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

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

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

0

java.awt.EventDispatchThread#processException уход за sun.awt.exception.handler system свойство. Это bug сообщается, фиксируется в 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); 
    } 
}