`
zhang_xzhi_xjtu
  • 浏览: 538297 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

实践中的重构20_一段可笑的异常处理逻辑

阅读更多
Code review也是一个充满乐趣的事情,在一次Code review中,发现了如下代码。
		try {
			f();
		} catch (RuntimeException e) {
			throw new RuntimeException(e);
		}

百思不得其解啊。为什么要捕捉一个RuntimeException又把它抛出去呢。在和原作者充分沟通后,明白了这段代码的来龙去脉。
首先,由其他地方的异常日志推断出这里调用方法f的时候,系统抛出了异常。但是,在错误日志中没有找到关于该异常的日志,于是怀疑异常没有被异常处理器捕捉到,咨询了其他同事,最后确定的方案为参考其他系统的处理方式,在这一层先捕捉住,重新包装一下再抛出去,这样处理的话则异常处理器就可以捕捉住该异常了。
我的问题是,如果异常处理器不能捕捉到原有的异常的话,如此包装再抛出一样是捕捉不到的啊。同事也同意我的看法,但是因为有其他同事的意见在先,以及在其他系统中存在类似的代码,所以就鬼迷心窍的把这段自己都不怎么相信的代码提交了。
事情的真相是这样的。
其他系统的代码如下,该处转换了异常的异常信息。
			try {
				f();
			} catch (RuntimeException e) {
				log(e);
				throw new RuntimeException("调用方法f发生异常", e);
			}

而在错误日志中找不到异常的原因,是因为日志对象的toString方法有一处手误。
		public String toString() {
			StringBuilder sb = new StringBuilder();
			// 把对象信息添加到sb对象中。
			return super.toString();
		}

为什么同事会提交自己都不怎么相信的代码呢?原因如下:
1 轻信了同事的意见。
2 虽然自己也对该方案有所怀疑,但是看到其他系统有类似的代码,就误以为该代码是正确的。
3 没有测试。
事情虽小,教训很多。
该文只是记录软件开发中的一段往事,并不针对任何人。很多软件工程师都会有犯傻的时候,而且所犯的错误低级的让人可笑。重要的不是我们犯了多么低级的错误,重要的是我们从一个个事后人人都认为低级到极限的错误中能得到什么。
分享到:
评论
21 楼 freish 2011-03-08  
qianhd 写道
同事被所谓的大牛给忽悠了
我宁愿给thread加uncaughtExceptionHandler来判断是否抛出过异常



有时候我相信不仅仅是被忽悠问题

很可能是不得已而为之,职场政治啊职场政治

明明知道有些事情没有效果,但不得不做
20 楼 lewisw 2011-03-08  
zuiyanwangyue 写道
dwangel 写道
我觉得是copy代码那位同志把  log(e) 给漏了而己……

或者是本来加了log,后来觉得不用加了(日志输出太多),删log没删try catch。


同意这个意见,楼主有点一厢情愿了。



不管日志的问题, 这样做本来就有很大问题, 一般来说谁能处理谁catch, 做了log又怎么样? 抛出同样的异常,在调用这个方法的地方或者更外层同样会获得这个异常,要不要也catch一下,也重新抛出一下? 你的日志里面同一个异常信息要输出个几十遍?
19 楼 lkjust08 2011-03-08  
LZ是的有道理,很多时候,我们会以现在系统中的代码去左右自己的代码。
18 楼 zhang_xzhi_xjtu 2011-03-08  
lydawen 写道
我见过公司老代码:
if(user==null){
    throw new XXXException("用户"+user.getUsername+"未找到,数据异常");
}

生活有乐趣。
17 楼 kinglyhum 2011-03-08  
光看一小段不行,要结合具体环境才行
16 楼 lydawen 2011-03-08  
我见过公司老代码:
if(user==null){
    throw new XXXException("用户"+user.getUsername+"未找到,数据异常");
}
15 楼 zhang_xzhi_xjtu 2011-03-08  
请看最后的分析
14 楼 zuiyanwangyue 2011-03-08  
dwangel 写道
我觉得是copy代码那位同志把  log(e) 给漏了而己……

或者是本来加了log,后来觉得不用加了(日志输出太多),删log没删try catch。


同意这个意见,楼主有点一厢情愿了。
13 楼 dwangel 2011-03-08  
我觉得是copy代码那位同志把  log(e) 给漏了而己……

或者是本来加了log,后来觉得不用加了(日志输出太多),删log没删try catch。
12 楼 qiaoqinqie 2011-03-08  
baby8117628 写道
try {   
    f();   
} catch (RuntimeException e) {   
    throw new RuntimeException(e);   
}  



不明白这样写 有啥么不对?

讨论的不是这么这么写有什么不对吧。是因为没有去分析原因,为什么日志里面没有记录
11 楼 baby8117628 2011-03-08  
try {   
    f();   
} catch (RuntimeException e) {   
    throw new RuntimeException(e);   
}  



不明白这样写 有啥么不对?
10 楼 maplechenda 2011-03-08  
又是口水贴
9 楼 mtnt2008 2011-03-08  

追求刨根问底的,把问题彻底搞明白

这才是程序员应该有的态度
8 楼 qianhd 2011-03-08  
同事被所谓的大牛给忽悠了
我宁愿给thread加uncaughtExceptionHandler来判断是否抛出过异常
7 楼 zhang_xzhi_xjtu 2011-03-07  
xychidy520_java 写道
对于任何问题,都应该找到其本质。我觉得楼主的本意应该这样吧。我自己也有过这样的失误,现在时候都会注意,一旦有问题,一定要努力去找到其最终的原因。


6 楼 spyker 2011-03-07  
没有debug么?
5 楼 johnicesea 2011-03-07  
freish 写道
“事情虽小,教训很多。”


我没看到有什么教训,这段代码一点也不会影响程序的正常运行

"程序正常运行"是最低的要求而已,我们还有更高的追求。
4 楼 xychidy520_java 2011-03-07  
对于任何问题,都应该找到其本质。我觉得楼主的本意应该这样吧。我自己也有过这样的失误,现在时候都会注意,一旦有问题,一定要努力去找到其最终的原因。
3 楼 volking 2011-03-07  
写代码的时候估计宕机了
2 楼 freish 2011-03-07  
“事情虽小,教训很多。”


我没看到有什么教训,这段代码一点也不会影响程序的正常运行

相关推荐

Global site tag (gtag.js) - Google Analytics