Java サブスレッドの例外を捕捉する場合、一般的には2通り考えられる。
(1)ThreadGroup uncaughtException を使う方法
ThreadGroup grpRoot = new ThreadGroup("Root"){
@Override
public void uncaughtException(Thread t,Throwable e){
// 例外を捕捉
System.out.println("# ThreadGroup group = "+getName());
System.out.println("# Thread is "+t.getName());
System.out.println("# Throwable is "+e.getClass().getName());
System.out.println("# Throwable message = ["+e.getMessage()+"]");
}
};
new Thread(grpRoot
,new Runnable(){
@Override
public void run(){
System.out.println("SubProcess run!");
throw new RuntimeException("Error test !! ");
}
}
,"sub"
).start();
(2)Thread の setUncaughtExceptionHandler で、UncaughtExceptionHandler を指定する方法、
Thread th = new Thread(new SubProcess(),"sub");
th.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler(){
@Override
public void uncaughtException(Thread t,Throwable e){
// 例外を捕捉
System.out.println("# Thread is "+t.getName());
System.out.println("# Thread ID is "+t.getId());
System.out.println("# Throwable is "+e.getClass().getName());
System.out.println("# Throwable message = ["+e.getMessage()+"]");
}
});
th.start();
ExecutorService を使う場合は、ちょっと工夫が必要です。