首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

异步调用时,错误rethrow的编程模式

2012-10-29 
异步调用时,异常rethrow的编程模式今天看到的一个问题,顺便总结如下:?Java编程中,程序异常处理是一个跑不

异步调用时,异常rethrow的编程模式

今天看到的一个问题,顺便总结如下:

?

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()里面的具体哪一个步骤、哪一个代码调用的异步调用。

这会耽误程序的调试,问题的解决。

?

?

rethrowlog异常的同学多留意一下

1 楼 ▄︻┳═一 2009-06-25   引用一个异常对象,意味着JVM dump出的当时的堆栈调用情况。throw 或rethrow出去的意味着,让上级了解当时这个堆栈。

如果只是throw/log.error exceptionFromThreadB,那么从后台的日志文件中,并不能看出原来是xxxx()这个方法进行异步调用发生的异常,更不知道是xxx()里面的具体哪一个步骤、哪一个代码调用的异步调用。

这会耽误程序的调试,问题的解决。


如果仅仅是出于调试目的,为什么不把打logger的类名和行号输出,而采用这种方式呢? 2 楼 xibaluma 2009-06-25   [quote="Qieqie"]
[size=13px; font-family: tahoma;]
今天看到的一个问题,顺便总结如下:[/size]


LZ稍微讲的晦涩了点 我还没看懂 。

热点排行