2012-02-07 3 views
2

this article과 같이 UncaughtExceptionHandler를 작성했습니다.UncaughtExceptionHandler가 일부 예외를 catch하지 않습니다.

나는 또한이 같은 모든 스레드에서 예외 잡기 위해이 핸들러 등록 :이 같은

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) 

이유가없는 예외 : 그러나

Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler()); 

을, 일부 예외가 누락?

+0

://stuffthathappens.com/blog/2007/10/15/one-more-note-on-uncaught-exception-handlers/ –

+0

처리기가 확인되지 않은 예외를 catch합니까? 그것의 소스 코드를 게시하십시오. –

+0

물론, 튜토리얼과 매우 흡사합니다. 내 자신의 응용 프로그램에서 이것을 수행하는 방법을 알아 내기 위해 자습서를 사용하고 있습니다! –

답변

1

아마도이 예외가 발생한 스레드는 이미 자체의 catch되지 않은 예외 처리기를 가지고 있습니다. 이 경우 기본 처리기가 사용되지 않습니다. 관련 스레드 (여기서 이벤트 디스패처 스레드)에서 getUncaughtExceptionHandler() 메소드를 호출하여이를 확인할 수 있습니다.

또한이 스레드는 기본 처리기에 위임하지 않고 예외를 처리하는 특수 ThreadGroup에 속할 수 있습니다.

두 경우 모두 처리기를 명시 적으로 setUncaughtExceptionHandler() 메서드를 사용하여이 스레드의 처리기로 설정할 수 있습니다.

0

java.awt.EventDispatchThread#processExceptionsun.awt.exception.handler 시스템 속성. 이 bug 자바에서 수정 될 것으로보고있다 7. 다음 자바 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); 
    } 
} 
관련 문제