本站首页    管理页面    写新日志    退出


«October 2025»
1234
567891011
12131415161718
19202122232425
262728293031


公告
本博客在此声明所有文章均为转摘,只做资料收集使用。并无其他商业用途。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:210
评论数量:205
留言数量:-19
访问次数:923918
建立时间:2007年5月10日




[J2SE相关]异步调用时,异常rethrow的编程模式
文章收藏,  网上资源,  软件技术,  电脑与网络

李小白 发表于 2009/6/25 17:57:10

作者 Qieqie http://www.javaeye.com/topic/414366 今天看到的一个问题,顺便总结如下:   Java编程中,程序异常处理是一个跑不掉的东西。   对于同步编程: 调用某个可能抛出checked或unchecked异常的方法时,可以直接在方法中声明throws继续往上处理,也可以在本方法中进行try catch处理(比如进行日志登记)。 catch处理后,是否进行throw e或throw new XxxException(e)视具体情况而定。这些处理,从技术上都是正确的,我们也处理地很好。问题不在这。   对于异步编程(重点): 在线程A中,从底层的Thread.run一直运行调用到某个方法xxx(),xxx()设置线程之间的共享对象并notify通知另外一个线程B处理输入的任务, 如果任务失败时 (比如验证错误、程序空指针错误、超时错误等等) 这样情况下,通常按照以下判断程序的好坏: 1、 差的做法:A线程无法收到失败通知,也就是B线程产生的异常对象无法通知到A,使A无法接收该异常; 2、 好的做法:B的异常能够被A接收到!技术上是B发生异常时,要把异常记录到某共享对象,然后B线程通知A线程取回该异常。   但,xxx()获取到B的异常后,如何处理呢?分为3种情况: 1、 xxx() 自己try catch处理掉 — 没问题,如果真的应该由它处理的话 2、xxx() 需要把这个异常rethrow出去给上级调用者,此时要注意了,请不要简单这样写throw exceptionFromThreadB; 而应该写成这样:throw new XxxException(exceptionFromThreadB); 3、 如果第1步的try catch中需要做logger.error记录,也请这样记录logger.error(“”, new XxxException(exceptionFromThreadB));,不写成logger.error(“”, exceptionFromThreadB);   为什么?   一个异常对象,意味着JVM dump出的当时的堆栈调用情况。throw 或rethrow出去的意味着,让上级了解当时这个堆栈。 如果只是throw/log.error exceptionFromThreadB,那么从后台的日志文件中,并不能看出原来是xxxx()这个方法进行异步调用发生的异常,更不知道是xxx()里面的具体哪一个步骤、哪一个代码调用的异步调用。 这会耽误程序的调试,问题的解决。


阅读全文(1571) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.078 second(s), page refreshed 144786753 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号