【问题标题】:UncaughtExceptionHandler not catching some exceptionsUncaughtExceptionHandler 没有捕捉到一些异常
【发布时间】:2012-02-07 17:39:18
【问题描述】:

我创建了一个 UncaughtExceptionHandler,如 this article 所示。

我还注册了这个处理程序来捕获所有线程中的异常,如下所示:

    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)

为什么会漏掉这样的异常?

【问题讨论】:

  • 这看起来与您链接到的教程中的内容非常相似...stuffthathappens.com/blog/2007/10/15/…
  • 您的处理程序是否捕获未经检查的异常?请贴出它的源代码。
  • 当然,它与教程非常相似。我正在使用本教程来了解如何在我自己的应用中执行此操作!
  • 我认为确实如此。我已经实现了 uncaughtException(final Thread t, final Throwable e): public void uncaughtException(final Thread t, final Throwable e) { if (SwingUtilities.isEventDispatchThread()) { showException(t, e); } else { SwingUtilities.invokeLater(new Runnable() { public void run() { showException(t, e); } }); } }
  • 有点类似:stackoverflow.com/questions/3171394/…。您是否尝试将纯打印内容放入处理程序?

标签: java exception awt uncaughtexceptionhandler


【解决方案1】:

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

也可能是这个线程属于一个特殊的ThreadGroup,它处理异常而不是委托给默认处理程序。

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

【讨论】:

    【解决方案2】:

    java.awt.EventDispatchThread#processException关心sun.awt.exception.handler系统属性。据报道,此bug 在 Java 7 中已修复。

    对于 Java 6,next 非常适合我:

    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-20
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 2015-11-21
      • 2016-02-28
      相关资源
      最近更新 更多