加入社区

订阅:www.yunweipai.com/feed

QQ群:
1群:201777608 - 运维综合
2群:526871767 - 运维综合
3群:1689067 - Linux Shell脚本

微博:weibo.com/tektea

微信:yunweipai(或扫描以下二维码)

合作伙伴

小猪动图 - GIF动图素材库_GIF在线工具

Java异常滥用--把逻辑交给魔鬼

在Java代码中,异常大家都不会陌生,今天我们谈谈异常的滥用。

Java的异常分为两类:RuntimeExecption, Exception。

RuntimeException算是一种运行时错误,这些异常可以通过代码处理避免的。如著名的NullPointerException,我们可以通过判断对象是否等于null来避免抛出此异常。
而Exception更多的算是一种代码中的异常分支,是无法通过代码处理来避免的,如IOException,IO操作被中断,属于一种正常的代码处理。

或者,从最终用户的角度来说,Exception是一种用户看得到的能明白的,异常分支处理;而RuntimeException用户是理解不了的,是给机器或程序员用的。

不过,现在很多同学们写代码,为了图方便,把异常滥用了。

我们看一段典型的代码:
package test.unit;

public class ExceptionExample {
        public void catchException(){
                try{
                        System.out.println("There is no exception.");
                        //do someting more ....
                }catch(Exception e){
                        e.printStackTrace();
                }
        }
        
        public void catchRunTimeException(){
                try{
                        System.out.println("There is no runtimeexception.");
                        //do someting more ....
                }catch(RuntimeException e){
                        
                }
        }
        
        public void catchError(){
                try{
                        System.out.println("There is no runtimeexception.");
                        //do someting more ....
                }catch(RuntimeException e){
                        e.printStackTrace();
                }
        }
}

上面这段代码,是一个示意,实际应用要复杂一些,但是对异常的处理,实际代码中确实有这么写的。
我在我们项目中就发现不少这种的代码。

这种代码,相当于给代码逻辑中增加了不确定性

你不知道什么时候会执行到异常分支,且单元测试也永远无法覆盖,不论你怎样moke他。
某种条件下执行到了此分支,也不能提示明确的错误信息给用户。
这种代码,相当于把逻辑交给了魔鬼,无法预测。

转载请注明:运维派 » Java异常滥用--把逻辑交给魔鬼

0
3.0k
3
  1. 有些时候Exception的捕获错误也可能导致程序问题,如捕获了某个Exception,而程序抛出的却是另外一个Exception,导致逻辑错误。
    而有些时候不需要捕获Exception,直接抛给调用者可能更合适,如公共组件。
    有些时候捕获Exception是为了程序更可靠,如不想某段不重要的代码影响了重要代码的逻辑。

    • @Lin 你说的捕获一种异常但是抛出的是另外一种异常,这个是代码bug呀。。。