サブスレッドの例外を捕捉

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 を使う場合は、ちょっと工夫が必要です。