From Gossip@Openhome

Java Gossip: UncaughtExceptionHandler

在J2SE 5.0之前,如果您想要統一處理某些執行緒的unchecked例外,您可以使用一個ThreadGroup來管理,您繼承ThreadGroup,並重 新定義其uncaughtException()方法,而在J2SE 5.0之後,您不用這麼麻煩,您可以讓您的例外處理類別實作Thread.UncaughtExceptionHandler,並實現其 uncaughtException()方法,例如:
  • ThreadExceptionHandler.java
package onlyfun.caterpillar;

public class ThreadExceptionHandler
implements Thread.UncaughtExceptionHandler {
public void uncaughtException(Thread t, Throwable e) {
System.out.println(t.getName());
e.printStackTrace();
}
}

您可以使用Thread的setUncaughtExceptionHandler()方法來設定例外處理物件,例如:
  • ThreadExceptionDemo.java
package onlyfun.caterpillar;

public class ThreadExceptionDemo {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
public void run() {
// 除 0 的錯誤
int n = 1/0;
}
}, "testThread");

thread.setUncaughtExceptionHandler(
new ThreadExceptionHandler());
thread.start();
}
}

在這個程式中,我們故意產生除零的例外,例外丟出後會由ThreadExceptionHandler物件來處理,執行結果如下:
testThread
 java.lang.ArithmeticException: / by zero
    at onlyfun.caterpillar.ThreadExceptionDemo$1.run(
               ThreadExceptionDemo.java:8)
    at java.lang.Thread.run(Unknown Source)