异常链:有时候我们会捕获一个异常后再抛出另一个异常
顾名思义就是将异常发生的原因一个传一个串起来,即把底层的异常信息传给上层,这样逐层抛出。
定义testOne,testTwo,testThree方法,testTwo对testOne抛出的异常进行捕获,testThree对testTwo抛出的异常进行捕获:
package java_exception;
public class TryDemoFive {
public static void main(String[] args) {
try {
testThree();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void testOne() throws HotelAgeException {
throw new HotelAgeException();
}
public static void testTwo() throws Exception {
try {
testOne();
} catch (Exception e) {
throw new Exception("我是新产生的异常1");
}
}
public static void testThree() throws Exception {
try {
testTwo();
} catch (Exception e) {
throw new Exception("我是新产生的异常2");
}
}
}
输出:
java.lang.Exception: 我是新产生的异常2
at java_exception.TryDemoFive.testThree(TryDemoFive.java:29)
at java_exception.TryDemoFive.main(TryDemoFive.java:6)
可看到,只输出了最后一个方法的异常信息,丢失了前面两个方法的异常信息,相当于新抛出一个异常会导致前面的异常丢失。
对于这种情况,解决办法如下:
方法1(方法testTwo):直接在新抛出的异常后添加捕获到的异常信息;
方法2(方法testThree):使用initCause()。
public static void testTwo() throws Exception {
try {
testOne();
} catch (Exception e) {
throw new Exception("我是新产生的异常1", e);
}
}
public static void testThree() throws Exception {
try {
testTwo();
} catch (Exception e) {
//throw new Exception("我是新产生的异常2");
Exception e1 = new Exception("我是新产生的异常2");
e1.initCause(e);
throw e1;
}
}
输出:
java.lang.Exception: 我是新产生的异常2
at java_exception.TryDemoFive.testThree(TryDemoFive.java:30)
at java_exception.TryDemoFive.main(TryDemoFive.java:6)
Caused by: java.lang.Exception: 我是新产生的异常1
at java_exception.TryDemoFive.testTwo(TryDemoFive.java:21)
at java_exception.TryDemoFive.testThree(TryDemoFive.java:27)
... 1 more
Caused by: java_exception.HotelAgeException: 18岁以下,80岁以上的住客必须由亲友陪同
at java_exception.TryDemoFive.testOne(TryDemoFive.java:14)
at java_exception.TryDemoFive.testTwo(TryDemoFive.java:19)
... 2 more
本文探讨了在Java中如何处理异常链,确保在抛出新的异常时不会丢失原始异常信息。通过实例展示了直接附加异常信息和使用`initCause()`方法来保持异常堆栈跟踪的完整性。这种方法在调试和问题定位时至关重要。

5064

被折叠的 条评论
为什么被折叠?



