在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他。
某种条件下执行到了此分支,也不能提示明确的错误信息给用户。
这种代码,相当于把逻辑交给了魔鬼,无法预测。
本文链接:https://www.yunweipai.com/1560.html
的确是,Java中的异常是值得我们去思考的。
有些时候Exception的捕获错误也可能导致程序问题,如捕获了某个Exception,而程序抛出的却是另外一个Exception,导致逻辑错误。
而有些时候不需要捕获Exception,直接抛给调用者可能更合适,如公共组件。
有些时候捕获Exception是为了程序更可靠,如不想某段不重要的代码影响了重要代码的逻辑。
你说的捕获一种异常但是抛出的是另外一种异常,这个是代码bug呀。。。