本文主要内容:处理Java异常的几种情况下的错误示范和正确示范。用Java处理异常不是一件容易的事,幸好对于测试来讲,没有那么多悬而不决的场景,只要开发之前进行简单的异常约束基本能解决所有问题。
本文将向演示最重要的一些处理Java异常的场景,用来入门或改善异常处理。异常是程序执行期间的异常情况。
永远不要在 catch 块中毁灭异常
错误示范:
catch (NoSuchMethodException e) {
return null;
}
永远不要直接返回null而不是处理异常,它会清除掉异常信息并导致错误。如果不了解失败的原因,那么将来就难以发现问题从而更快解决问题。
声明可能抛出的特定检查异常
错误示范:
public void test() throws Exception {
}
尽量避免使用上面的代码,必须声明该方法可能引发的特定检查异常。如果用户有许多已检查的异常,则必须将其覆盖在用户的异常中,并将信息附加到异常消息中。
正确示范:
public void test() throws SpecificException1, SpecificException2 {3
}
不要 catch exception,而需要 catch 特定的子类
错误示范:
try {
someMethod();
}catch (Exception e) {
LOGGER.error("失败了!", e);
}
catch异常的主要问题是,如果用户稍后调用的方法将新检查的异常,则开发人员希望处理特定的新异常。如果用户的代码catch exception,那么将永远无法理解该变化。用户的代码于具体需求的差异,并且可能在运行时的某个时间点崩溃。
永远不要catch任何 Throwable 类
Java提供了表示不同类型异常的类层次结构。java.lang包的Throwable类是所有异常类的超类。
下图是 Java 异常类的继承关系,看完之后相信你再也不会有catch throwable的想法了。
└────Throwable
├────Error
│ ├────NoClassDefFoundError
│ └────OutOfMemoryError
└────Exception
├────RuntimeException
│ ├────IllegalArgumentException
│ └────NullPointerException
├────FileNotFoundException
└────IOException
自定义异常避免丢失堆栈信息
错误示范:
catch (NoSuchMethodException e)
{
throw new MyServiceException("自定义错误: " + e.getMessage());
}
上面的命令可能会失去异常的堆栈跟踪,对于排查问题制造了障碍。
正确示范:
catch (NoSuchMethodException e) {
throw new MyServiceException("自定义错误: " , e);
}
不要同时记录和抛出异常
错误示范:
catch (NoSuchMethodException e) {
LOGGER.error("错误:", e);
throw e;
}
如上面的代码所示,抛出和记录可能会在日志文件中导致多个日志消息。对于浏览日志的开发人员,代码中的单个问题可能会造成大量错误信息,不利于定位BUG。
不要从 finally 块抛出异常
错误示范:
try {
someMethod(); //抛出异常
}
finally
{
cleanUp(); //如果这里也抛出异常,则无法处理
}
准确地说,cleanUp()永远不会引发异常。在上述情况下,如果someMethod()出现异常,并且在finally块中,cleanUp()也出现异常,则该方法之外的其他异常将消失,原始的第一个异常(正确的原因)将永远消失。
毫无作用的 catch catch (NoSuchMethodException e)
{
throw e; //直接抛出没什么卵用
}
如果不能在catch块中处理它,那么最好的建议是直接抛出这个异常。
不处理异常,使用 finally 而不是 catch
正确示范:
try {
someMethod();
}
finally
{
cleanUp();
}
这也是一个好习惯。如果在方法内部访问someMethod(),并且抛出一些您不想在方法中处理的异常,但是仍然希望进行cleanUp()以防万一,那么请在finally块中进行cleanUp()。
结论
java异常处理是必不可少的,有多种针对不同场景下的解决方案。我歘和本文可帮助Java测试新手获得有关处理Java异常的基本认识。
郑重声明:“FunTester” 首发,欢迎关注交流,禁止第三方转载。更多原创文章:Fhaohaizi@163.com。
热文精选