2012-02-07 140 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); 
    } 
}