2012-02-07 6 views
2

this articleに示す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) 

は、なぜそれがこのような例外が欠けていますか?

+0

:/ /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システムプロパティです。このbugはJavaで固定されることが報告された7次のJava 6の場合

は完全に私のために働いている:

あなたは...のhttpにリンクチュートリアルのものと非常に似ています
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); 
    } 
} 
関連する問題