异常链:有时候我们会捕获一个异常后再抛出另一个异常
顾名思义就是将异常发生的原因一个传一个串起来,即把底层的异常信息传给上层,这样逐层抛出。
定义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