java异常:异常链简介

本文探讨了在Java中如何处理异常链,确保在抛出新的异常时不会丢失原始异常信息。通过实例展示了直接附加异常信息和使用`initCause()`方法来保持异常堆栈跟踪的完整性。这种方法在调试和问题定位时至关重要。
摘要由CSDN通过智能技术生成

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

定义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
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值