其他分享
首页 > 其他分享> > 异常链简介

异常链简介

作者:互联网

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

定义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