参考
层次
吞异常
参考:https://blog.csdn.net/weixin_42653621/article/details/82494465
public void testThrowFileEx() throws FileNotFoundException{
throw new FileNotFoundException();
}
public void testThrowClassEx() throws ClassNotFoundException{
try {
testThrowFileEx();
} catch (FileNotFoundException e) {
throw new ClassNotFoundException();
}
}
最后只剩下ClassNotFoundException,异常被吞了。
建议做法:
1、当我们不需要转义异常的,就直接抛出调用函数的异常即可。
2、当我们需要转义异常的,就需要先在抛异常前,先打印堆栈信息。
在具体项目中使用日志工具打印堆栈信息。
3、真实项目中,当我们需要转义异常的,例如从AException转为BException,这个时候有两个处理方式:
3.1、当BException构造函数可以传递Throwable的时候,直接throw new BException(e);即可。
3.2、当BException构造函数不可以传递Throwable的时候,就需要自己调用initCause()初始化BException异常引起的源异常。
这里就涉及到Exception的cause对象问题了,cause对象是指我们的异常是由于什么异常引起的。
图中e2、e3是通过throwable继承而来,e5是通过initCause继承而来,打印时有所区别
打印
注意打印时候不要丢掉堆栈信息,需要打印堆栈的时候用第一种方式打印。
// 打印出完整的e的堆栈。如果是如上吞异常情境下抛出的,只会打打印最后的异常;同时可能引起
log.error(e);
// 打印出e的描述性信息,而不是堆栈信息
log.error(e.toString());