Java异常链

一.Java中的异常链

目的:追踪到异常最初发生的位置

方式:重新构造异常

 1 public class Rethrowing {
 2
 3     //模拟A层异常
 4     public static void A() throws Exception {
 5         System.out.println("现在在A层:");
 6         throw new Exception("A层出现异常");
 7     }
 8
 9     //模拟B层
10     public static void B() throws Exception {
11         try {
12             A();
13         } catch (Exception e) {
14             System.out.println("现在在B层: ");
15             e.printStackTrace();
16             System.out.println("B层执行e.printStackTrace()完成: ");
17             throw e;//此异常对象是原始异常对象,持有全部站轨迹信息
18         }
19     }
20
21     //模拟C层
22     public static void C() throws Exception {
23         try {
24             B();
25         } catch (Exception e) {
26             System.out.println("现在在C层: ");
27             e.printStackTrace();
28             System.out.println("C层执行e.printStackTrace()完成: ");
29             //更新调用栈信息,抛出的异常对象中包含的是重新抛出点的信息,有关原来异常发生点的信息会丢失。
30             //会丢失原异常抛出点到当前抛出点的栈轨迹
31             //throw (Exception)e.fillInStackTrace();
32
33             //以此异常为cause构造新的异常并抛出,可通过这个异常链追踪到异常最初发生的位置
34 //            throw new RuntimeException(e);
35             throw e;
36         }
37     }
38
39     public static void main(String[] args) {
40
41         try {
42             C();
43         } catch (Exception e) {
44             System.err.println("现在在main层:");
45             e.printStackTrace();
46             System.out.println("main层执行e.printStackTrace()完成: ");
47         }
48     }
49 }

结果:

 1 现在在A层:
 2 现在在B层:
 3 java.lang.Exception: A层出现异常
 4     at day12.Rethrowing.A(Rethrowing.java:12)
 5     at day12.Rethrowing.B(Rethrowing.java:18)
 6     at day12.Rethrowing.C(Rethrowing.java:30)
 7     at day12.Rethrowing.main(Rethrowing.java:56)
 8 B层执行e.printStackTrace()完成:
 9 现在在C层:
10 java.lang.Exception: A层出现异常
11     at day12.Rethrowing.A(Rethrowing.java:12)
12     at day12.Rethrowing.B(Rethrowing.java:18)
13     at day12.Rethrowing.C(Rethrowing.java:30)
14     at day12.Rethrowing.main(Rethrowing.java:56)
15 C层执行e.printStackTrace()完成:
16 现在在main层:
17 java.lang.Exception: A层出现异常
18     at day12.Rethrowing.A(Rethrowing.java:12)
19     at day12.Rethrowing.B(Rethrowing.java:18)
20     at day12.Rethrowing.C(Rethrowing.java:30)
21     at day12.Rethrowing.main(Rethrowing.java:56)
22 main层执行e.printStackTrace()完成: 

将 throw e;改为 throw new RuntimeException(e); 用来重新构造异常则

结果:

 1 现在在A层:
 2 现在在B层:
 3 java.lang.Exception: A层出现异常
 4     at day12.Rethrowing.A(Rethrowing.java:12)
 5     at day12.Rethrowing.B(Rethrowing.java:18)
 6     at day12.Rethrowing.C(Rethrowing.java:30)
 7     at day12.Rethrowing.main(Rethrowing.java:48)
 8 B层执行e.printStackTrace()完成:
 9 现在在C层:
10 java.lang.Exception: A层出现异常
11     at day12.Rethrowing.A(Rethrowing.java:12)
12     at day12.Rethrowing.B(Rethrowing.java:18)
13     at day12.Rethrowing.C(Rethrowing.java:30)
14     at day12.Rethrowing.main(Rethrowing.java:48)
15 C层执行e.printStackTrace()完成:
16 现在在main层:
17 java.lang.RuntimeException: java.lang.Exception: A层出现异常
18     at day12.Rethrowing.C(Rethrowing.java:40)
19     at day12.Rethrowing.main(Rethrowing.java:48)
20 Caused by: java.lang.Exception: A层出现异常
21     at day12.Rethrowing.A(Rethrowing.java:12)
22     at day12.Rethrowing.B(Rethrowing.java:18)
23     at day12.Rethrowing.C(Rethrowing.java:30)
24     ... 1 more
25 main层执行e.printStackTrace()完成: 

能够追溯到最原始的异常在A层!

补充:

  • e.getCause():返回到最初发生异常的位置

修改main函数,将 e.printStackTrace();改为System.out.println("最初异常发生的位置:"+e.getCause().getMessage());

 1 public static void main(String[] args) {
 2
 3     try {
 4         C();
 5     } catch (Exception e) {
 6
 7         System.err.println("现在在main层:");
 8 //            e.printStackTrace();
 9         System.out.println("最初异常发生的位置:"+e.getCause().getMessage());
10         System.out.println("main层执行e.printStackTrace()完成: ");
11
12     }
13 }

结果:

 1 现在在A层:
 2 现在在B层:
 3 java.lang.Exception: A层出现异常
 4     at day12.Rethrowing.A(Rethrowing.java:12)
 5     at day12.Rethrowing.B(Rethrowing.java:18)
 6     at day12.Rethrowing.C(Rethrowing.java:30)
 7     at day12.Rethrowing.main(Rethrowing.java:48)
 8 B层执行e.printStackTrace()完成:
 9 现在在C层:
10 java.lang.Exception: A层出现异常
11     at day12.Rethrowing.A(Rethrowing.java:12)
12     at day12.Rethrowing.B(Rethrowing.java:18)
13     at day12.Rethrowing.C(Rethrowing.java:30)
14     at day12.Rethrowing.main(Rethrowing.java:48)
15 C层执行e.printStackTrace()完成:
16 现在在main层:
17 最初异常发生的位置:A层出现异常
18 main层执行e.printStackTrace()完成: 

原文地址:https://www.cnblogs.com/zhihaospace/p/12228912.html

时间: 2024-10-14 09:05:50

Java异常链的相关文章

JAVA基础教程之JAVA异常机制

今天我们主要来说一说JAVA异常机制方面的内容.自设JAVA学习群457036818,大家可以交流一下 一. 异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误.本文主要传授的是一些滚与Java语言的异常处理.Java语言的异常处理框架,是Java语言健壮性的一个重要体现. Java把异常当作对象来处理,而且定义一个基类java.lang.Throwable作为所有异常的超类.在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception.J

java异常丢失及异常链

异常丢失的情况: 先定义三个异常: public class ExceptionA extends Exception { public ExceptionA(String str) { super(); } } public class ExceptionB extends ExceptionA { public ExceptionB(String str) { super(str); } } public class ExceptionC extends ExceptionA { publi

java 第50节 Java中的异常链

2016-06-30 1 异常链 两个或多个不同的异常出现在同一个程序中,并且会发生嵌套抛出,我们称之为异常链. package com.java1995; /** * 异常链 * @author Administrator * */ public class ExceptionChainTest { public static void main(String[] args) { Calculator c=new Calculator(); try{ c.chufa(1, 0); }catch

java异常——捕获异常+再次抛出异常与异常链

[0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java异常--捕获异常+再次抛出异常与异常链 的相关知识: [1]捕获异常相关 1.1)如果某个异常发生的时候没有再任何地方进行捕获, 那程序就会运行终止: 并在控制台上打印出异常信息 , 其中包括异常的类型堆栈的内容: 1.2)要想捕获一个异常, 必须设置 try/catch 语句块: 1.2.1)如果在try语句块中抛出了一个在 catch子句中声明的异常类, 那么 case1)程序将

程序有异常不知道咋办?来学习Java异常处理知识点和异常链机制

Java异常处理知识点和异常链机制异常处理是程序设计中一个非常重要的方面,毕竟人无完人,不可能永不犯错,程序中有异常是很正常的, Java语言在设计的当初就考虑到这些问题,提出异常处理的框架的方案,下面是我对Java异常知识和异常链的一个总结.一.Java异常的基础知识异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.有些异常需要做处理,有些则不需要捕获处理,在编程过程中,首先应当尽可能去避免错误和异常发生,对于不可避免.不可预测的情况则在考虑异常发生时如何处理.J

java中的异常链

把捕获的异常包装成一个新的异常,在新的异常中添加对新的异常的引用,再把新异常抛出,就像是链式反应一样,这种就叫异常链. 代码实例: public static void main(String[] args){ ChainTest ct=new ChainTest();//创建chainTest实例 try{ ct.test2(); }catch(Exception e){ e.printStackTrace(); } } public void test1()throws DrunkExcep

Java提高:采用异常链传递异常

一.分析 异常需要封装,但是仅仅封装还是不够的,还需要传递异常.一个系统的友好型的标识,友好的界面功能是一方面,另一方面就是系统出现非预期的情况的处理方式了. 二.场景 比如我们的JEE项目一般都又三层:持久层.逻辑层.展现层,持久层负责与数据库交互,逻辑层负责业务逻辑的实现,展现层负责UI数据的处理. 又这样一个模块:用户第一次访问的时候,需要持久层从user.xml中读取数据,如果该文件不存在则提示用户创建之,那问题就来了:如果我们直接把持久层的异常FileNotFoundException

java异常面试常见题目

在Java核心知识的面试中,你总能碰到关于 处理Exception和Error的面试题.Exception处理是Java应用开发中一个非常重要的方面,也是编写强健而稳定的Java程序的关键,这自然使它成为面试题中的常客.关于Java中Error和Exception的面试题目多是关于Exception和Error的概念,如何处理Exception,以及 处理Exception时需要遵守的最佳实践等等.尽管关于多线程.垃圾回收.JVM概念和面向对象设计等方面的问题依然主宰着这类面试,你仍然需要为回答

Java异常总结

http://blog.csdn.net/hguisu/article/details/6155636 [-] 1 引子 2JAVA异常 4处理异常机制 1 捕获异常trycatch 和 finally try-catch语句 trycatch-finally语句 try-catch-finally 规则异常处理语句的语法规则 trycatchfinally语句块的执行顺序 2 抛出异常 throws抛出异常 使用throw抛出异常 4 Throwable类中的常用方法 5Java常见异常 ru