2012-02-07 61 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/ – 2012-02-07 17:44:28

+0

您的处理程序是否捕获未经检查的异常?请发布它的源代码。 – 2012-02-07 17:45:05

+0

当然,它与教程非常相似。我正在使用该教程来弄清楚如何在我自己的应用程序中执行此操作! – 2012-02-07 17:49:18

回答

1

可能是引发此异常的线程已经拥有自己的未捕获的异常处理程序。在这种情况下,不使用默认处理程序。您可以通过调用相关线程上的getUncaughtExceptionHandler()方法来检查此问题(这是此处的事件分派器线程)。

也可能是此线程属于特殊的ThreadGroup,它处理异常而不是将其委派给默认处理程序。

在这两种情况下,您都可以使用setUncaughtExceptionHandler()方法明确地将您的处理程序设置为此线程的处理程序。

0

java.awt.EventDispatchThread#processException关心sun.awt.exception.handler系统属性。这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); 
    } 
}