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他。
某种条件下执行到了此分支,也不能提示明确的错误信息给用户。
这种代码,相当于把逻辑交给了魔鬼,无法预测。

网友评论comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注

  1. Java武林博客说道:

    的确是,Java中的异常是值得我们去思考的。

  2. Lin说道:

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

Copyright © 2012-2017 YUNWEIPAI.COM - 运维派 - 粤ICP备14090526号-3
扫二维码
扫二维码
返回顶部