当一个线程因为未捕获异常而退出时,JVM会把这个事件报告给应用程序提供的UncaughtExceptionHandler,
如果handler不存在,默认的行为是向System.err打印出栈追踪信息。
public interface UncaughtExceptionHandler{
void uncaughtException(Thread t,Throwable e);
}
如何处理未捕获异常取决于对服务质量的需求。最常见的响应记录是记录一个错误信息并把栈追踪信息写入应用程序日志中,也可以进行其它更好的处理。
public class UEHLogger implements Thread.UncaughtException{
publicvoid uncaughtException(Thread t,Throwable e){
Logger logger=Logger.getAnonymousLogger();
logger.log(level.SERVERE,"exception:"+t.getName(),e);
}
}
只有通过execute提交的任务,才能将它抛出的异常送给未捕获异常的处理器:而通过submit提交的任务,抛出的任何异常,都被认为是任务返回状态的一部分,如果一个有submit提交的任务以异常作为终结,这个异常会被Future.get重抛出,包装在ExecutorException中。