异常链简介
作者:互联网
异常链:有时候我们会捕获一个异常后再抛出另一个异常
顾名思义就是将异常发生的原因一个传一个串起来,即把底层的异常信息传给上层,这样逐层抛出。
定义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
标签:Exception,java,简介,testTwo,TryDemoFive,exception,异常 来源: https://blog.csdn.net/Thumb_/article/details/120257574