跳到主要内容

14.5 异常链

  • 有时候我们会捕获一个异常后再抛出另一个异常
  • 顾名思义就是:将异常发生的原因一个传一个地串起来,即把底层的异常信息传给上层,这样逐层抛出。

示例:

package com.imooc.test;

public class TryDemo5 {
public static void main(String[] args) {
try {
TestThree();
} catch (Exception e) {
e.printStackTrace();
}
}

// 方法:testOne()
public static void testOne() throws HotelAgeException {
throw new HotelAgeException();
}

// 方法:testTwo()
public static void testTwo() throws Exception {
try {
testOne();
} catch (HotelAgeException e) {
throw new Exception("我是新产生的异常1", e);// 通过构造方法Exception(String message,Throwable cause)构造一个新的异常信息
}
}

// 方法:testThree()
public static void TestThree() throws Exception {
try {
testTwo();
} catch (Exception e) {
// 也可以通过实例化一个新的Exception对象e1
Exception e1 = new Exception("我是新产生的异常2");
// 再通过e1调用父类Throwable的方法initCause(Throwable cause)返回一个新的Exception对象
e1.initCause(e);
// 再抛出这个Exception类型对象e1
throw e1;
}
}
}

示例流程解读:

main()方法调用testThree()方法,testThree()调用testTwo()方法,testTwo()调用testOne()方法,然后testOne()方法抛出HotelAgeException异常;

由testTwo()捕获,它再将自己抛出的新异常和上一层捕获来的异常打包后继续抛出;

testThree()捕获到上一层testTwo()抛出的异常后又实例化一个新的Exception异常对象e1,e1调用initCause()方法把上一层捕获来的异常一起打包,再抛出,最后由主方法中的catch捕获。

主方法中捕获到的异常包含三个test方法抛出的所有异常信息。