【面试】Java异常链

来源:互联网 发布:安装美工刀片的圆规 编辑:程序博客网 时间:2024/05/29 17:37

什么是异常链?

百度百科:异常链是一种面向对象编程技术,指将捕获的异常包装进一个新的异常中并重新抛出的异常处理方式。原异常被保存为新异常的一个属性(比如cause)。这个想法是指一个方法应该抛出定义在相同的抽象层次上的异常,但不会丢弃更低层次的信息。

大白话:处理异常1的同时会抛出异常2.

通过自定义异常实现异常链?

1.自定义两个异常类

//自定义两个异常class MyException1 extends Exception{private static final long serialVersionUID = 1L;}//第二个异常class MyException2 extends Exception{private static final long serialVersionUID = 1L;public MyException2() {super();}public MyException2(Throwable throwable){super(throwable);}}

2.在两个方法中分别调用两个异常类

//该方法抛出第二个异常public void fun2() throws MyException2{try {fun1();} catch (MyException1 e) {e.printStackTrace();throw new MyException2();}}//该方法抛出一个异常public void fun1() throws MyException1{throw new MyException1();}

3.调用fun2,查看打印信息


可以看出控制台打印出两个异常信息,但是【百度百科】中对异常链的描述有一句:原异常被保存为新异常的一个属性(比如cause)。

所以,我们还要让MyException2 能够持有MyException1的环境信息,形成了一条链,我们也成为异常链。

4.实现异常链

修改fun2代码如下;

//该方法抛出第二个异常public void fun2() throws MyException2{try {fun1();} catch (MyException1 e) {e.printStackTrace();throw new MyException2(e);}}

5.运行,查看修改后的打印信息


这样,异常2就保存了异常1的信息,形成了一条链。

完整代码

package cn.com.test05;public class MainTest01 {public static void main(String[] args){MainTest01 m = new MainTest01();try{/* * 调用fun2 * fun2里面有fun1,fun1抛出异常1 * 捕捉异常1处理后,抛出异常2 */m.fun2();}catch(MyException2 e){e.printStackTrace();}}//该方法抛出第二个异常public void fun2() throws MyException2{try {fun1();} catch (MyException1 e) {e.printStackTrace();throw new MyException2(e);}}//该方法抛出一个异常public void fun1() throws MyException1{throw new MyException1();}}//自定义两个异常class MyException1 extends Exception{private static final long serialVersionUID = 1L;}//第二个异常class MyException2 extends Exception{private static final long serialVersionUID = 1L;public MyException2() {super();}public MyException2(Throwable throwable){super(throwable);}}



原创粉丝点击