异常链概念
有时候我们会捕获一个异常后抛出另外一个异常,顾名思义,就是将异常产生的原因一个一个串起来,将底层的异常信息传递给上层,这样逐层抛出。
以下代码的功能就是这样,
package cn.hpu.test;
public class TryDemoFive {
public static void main(String[] args) {
// TODO Auto-generated method stub
//主函数内调用了testThree();使用try-catch自己处理
try {
testThree();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//抛出HotelAgeException()异常对象,并在方法定义时,用throws关键字声明这个异常
public static void testOne() throws HotelAgeException{
throw new HotelAgeException();
}
//调用testOne();并使用try-catch处理,catch代码块内抛出新的异常
public static void testTwo() throws Exception{
try {
testOne();
}catch(Exception e){
//e.printStackTrace();
throw new Exception("我是新产生的异常1");
}
}
//调用testTwo()方法,使用try-catch处理,并抛出一个新的异常对象
public static void testThree() throws Exception{
try {
testTwo();
}catch(Exception e) {
throw new Exception("我是新产生的异常2");
}
}
}
运行结果:
java.lang.Exception: 我是新产生的异常2
at cn.hpu.test.TryDemoFive.testThree(TryDemoFive.java:33)
at cn.hpu.test.TryDemoFive.main(TryDemoFive.java:9)
结果分析:
结果只显示出了最后一个异常对象的信息。这是由于新抛出的异常导致旧异常信息丢失的现象
解决方案:
Throwable(String message, Throwable cause) Constructs a new throwable with the specified detail message and cause. |
Throwable类提供了一个带参构造方法,两个参数分别为异常的描述信息,和上一个异常对象,从而产生一个新的异常对象。也就是说我们使用构造方法来实现对旧异常信息的获取。4
package cn.hpu.test;
public class TryDemoFive {
public static void main(String[] args) {
// TODO Auto-generated method stub
//主函数内调用了testThree();使用try-catch自己处理
try {
testThree();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//抛出HotelAgeException()异常对象,并在方法定义时,用throws关键字声明这个异常
public static void testOne() throws HotelAgeException{
throw new HotelAgeException();
}
//调用testOne();并使用try-catch处理,catch代码块内抛出新的异常
public static void testTwo() throws Exception{
try {
testOne();
}catch(Exception e){
//e.printStackTrace();
throw new Exception("我是新产生的异常1",e);
}
}
//调用testTwo()方法,使用try-catch处理,并抛出一个新的异常对象
public static void testThree() throws Exception{
try {
testTwo();
}catch(Exception e) {
throw new Exception("我是新产生的异常2",e);
}
}
}
修改后的运行结果为:
java.lang.Exception: 我是新产生的异常2
at cn.hpu.test.TryDemoFive.testThree(TryDemoFive.java:39)
at cn.hpu.test.TryDemoFive.main(TryDemoFive.java:10)
Caused by: java.lang.Exception: 我是新产生的异常1
at cn.hpu.test.TryDemoFive.testTwo(TryDemoFive.java:29)
at cn.hpu.test.TryDemoFive.testThree(TryDemoFive.java:37)
... 1 more
Caused by: cn.hpu.test.HotelAgeException: 对不起,由于年龄限制,你需要在家属的陪同下才能入住
at cn.hpu.test.TryDemoFive.testOne(TryDemoFive.java:19)
at cn.hpu.test.TryDemoFive.testTwo(TryDemoFive.java:25)
... 2 more
这样就实现了对所有异常信息的获取。
说了这么多,其实一句话总结就是:可以调用Throwable(String message,Throwable cause)来保留底层异常的异常信息。
initCause(Throwable cause) 方法用来获取原始异常的描述信息,其中cause是原始异常的对象