浏览 3132 次
锁定老帖子 主题:线程运行中抛出异常的处理
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-02-17
最近项目里一个发送短消息的线程老是死掉,初步怀疑是由于网络原因。又不想弄个线程监视之类的,搜了一下 UncaughtExceptionHandler 刚好可以解决。 线程运行时抛出的运行时异常使用try catch 是无法捕捉到的,此时往往导致线程停止正常工作。
一、首先要写一个线程异常抛出后处理类,实现UncaughtExceptionHandler 接口,我的做法是发送一封系统内部邮件给管理员: /** * 线程执行错误后,发送一份内部邮件给管理员,要求线程在创建之后必须设置 setUncaughtExceptionHandler * @author HAIQING * */ public class SmsSendExceptionHandler implements UncaughtExceptionHandler { private static final Logger log = Logger.getLogger(SmsSendExceptionHandler.class); public void uncaughtException(Thread t, Throwable e) { String threadname=t.getClass().getName();//获得线程名 String subject="线程:"+t.getName()+"抛出异常,请检查"; StringWriter sw=new StringWriter(); PrintWriter pw=new PrintWriter(sw); e.printStackTrace(pw); String msg=sw.toString();//拿到线程报错的详细信息 String body="线程状态:"+t.getState()+"。类路径:"+t.getClass().getName()+"。异常详细信息:"+sw.toString(); log.error(sw.toString()); //以下代码是使用 反射机制 重新创建线程 // try { // Class tempclass=Class.forName(t.getClass().getName()); // t=(Thread)tempclass.newInstance(); // SmsSendExceptionHandler smsHandler=new SmsSendExceptionHandler(); // t.setUncaughtExceptionHandler(smsHandler); // t.start(); // log.info(threadname+"。重新创建实例并执行!"); // } catch (ClassNotFoundException e1) { // e1.printStackTrace(); // log.error("线程类路径:"+threadname+"未发现", e1); // } catch (InstantiationException e1) { // e1.printStackTrace(); // log.error("线程类:"+threadname+"创建失败", e1); // } catch (IllegalAccessException e1) { // e1.printStackTrace(); // log.error("线程类:"+threadname+"创建失败", e1); // } } } 二、线程创建时,设置一下: SmsSendExceptionHandler smsHandler=new SmsSendExceptionHandler(); SmsServiceThread smsSendThread = new SmsServiceThread(); smsSendThread.setUncaughtExceptionHandler(smsHandler); smsSendThread.start(); 原线程不需更改,这样当线程执行中,抛出运行时异常后便可以到 SmsSendExceptionHandler 中 执行 uncaughtException 方法。此时可得到 该线程信息和异常信息(Thread t, Throwable e); 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |