异常链

异常链概念

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

以下代码的功能就是这样,

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是原始异常的对象

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值