本文主要内容:处理Java异常
的几种情况下的错误示范和正确示范。用Java
处理异常不是一件容易的事,幸好对于测试来讲,没有那么多悬而不决的场景,只要开发之前进行简单的异常约束
基本能解决所有问题。
本文将向演示最重要的一些处理Java异常
的场景,用来入门或改善异常处理。异常是程序执行期间的异常情况。
错误示范:
catch (NoSuchMethodException e) {
return null;
}
永远不要直接返回null
而不是处理异常,它会清除掉异常信息并导致错误。如果不了解失败的原因,那么将来就难以发现问题从而更快解决问题。
错误示范:
public void test() throws Exception {
}
尽量避免使用上面的代码,必须声明该方法可能引发的特定检查异常。如果用户有许多已检查的异常,则必须将其覆盖在用户的异常中,并将信息附加到异常消息中。
正确示范:
public void test() throws SpecificException1, SpecificException2 {3
}
错误示范:
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
。
错误示范:
try {
someMethod(); //抛出异常
}
finally
{
cleanUp(); //如果这里也抛出异常,则无法处理
}
准确地说,cleanUp()
永远不会引发异常。在上述情况下,如果someMethod()
出现异常,并且在finally
块中,cleanUp()
也出现异常,则该方法之外的其他异常将消失,原始的第一个异常(正确的原因)将永远消失。
catch (NoSuchMethodException e)
{
throw e; //直接抛出没什么卵用
}
如果不能在catch
块中处理它,那么最好的建议是直接抛出这个异常。
正确示范:
try {
someMethod();
}
finally
{
cleanUp();
}
这也是一个好习惯。如果在方法内部访问someMethod()
,并且抛出一些您不想在方法中处理的异常,但是仍然希望进行cleanUp()
以防万一,那么请在finally
块中进行cleanUp()
。
java
异常处理是必不可少的,有多种针对不同场景下的解决方案。我歘和本文可帮助Java测试
新手获得有关处理Java异常
的基本认识。
Fhaohaizi@163.com
。