第十二章 重新抛出异常与异常链

重新抛出异常:

如果你想把刚捕获的异常扔给上一级处理,尤其是在使用Exception捕获所有异常的时候,既然已经得到了对当前异常对象的引用,可以直接把它重新抛出。重新抛出会把异常抛给上一级环境中的异常处理程序,同一个try块的后续catch子句将被忽略,但finally块不会。此外,异常对象的所有信息都得以保持,所以高一级环境中捕获此异常的处理程序可以从这个异常对象中得到所有信息。

 1 package 异常.Finally;
 2
 3 import java.io.IOException;
 4
 5 public class ReThrow {
 6
 7     public static void main(String[] args) {
 8         try {
 9             test();
10         } catch (Exception e) {
11             e.printStackTrace();
12         }
13     }
14
15     public static void test() throws Exception {
16         try {
17             throw new IOException();
18         }catch(Exception e) {
19             throw e;//向上抛出异常
20         }
21     }
22
23 }

控制台:

java.io.IOException
    at 异常.Finally.ReThrow.test(ReThrow.java:17)
    at 异常.Finally.ReThrow.main(ReThrow.java:9)

不必去担心异常对象的清理,它们都是在堆上new出来的,所以gc会把它们回收掉。

异常链:

常常会想要在捕获一个异常后抛出另一个异常,并且希望把原始的异常保存下来,这被称为异常链。在jdk1.4之后,所有的Throwable的子类在构造器中都可以接受一个cause(因由)对象作为参数,这个cause就用来表示原始异常,这样通过把原始异常传递给新的异常,使得即使在当前位置创建并抛出了新的异常,也能通过这个异常链追踪到异常发生的最初位置。在Throwable的子类中,只有三种基本的异常类提供了带参cause参数的构造器,它们是Error,Exception,RuntimeException。如果要想把其他类型的异常链链接起来,应该使用initCause()方法而不是构造器。

 1 package 异常.Finally;
 2
 3 import java.io.EOFException;
 4 import java.io.IOException;
 5
 6 public class ReThrow {
 7
 8     public static void main(String[] args) {
 9         try {
10             exp();
11         } catch (Exception e) {
12             e.printStackTrace();
13         }
14     }
15
16     public static void test() throws Exception {
17         try {
18             throw new EOFException();
19         }catch(Exception e) {
20             //将原始的EOFException保存下来,抛出另一个异常IOException
21             IOException io = new IOException("IO异常");
22             io.initCause(e);
23             throw io;
24         }
25     }
26
27     public static void exp() throws Exception {
28         try {
29             test();
30         }catch(Exception e) {
31             //对于Exception可以直接在构造器中指定原始异常
32             Exception ex = new Exception(e);
33             throw ex;
34         }
35     }
36
37 }

控制台:

java.lang.Exception: java.io.IOException: IO异常
    at 异常.Finally.ReThrow.exp(ReThrow.java:31)
    at 异常.Finally.ReThrow.main(ReThrow.java:10)
Caused by: java.io.IOException: IO异常
    at 异常.Finally.ReThrow.test(ReThrow.java:21)
    at 异常.Finally.ReThrow.exp(ReThrow.java:29)
    ... 1 more
Caused by: java.io.EOFException
    at 异常.Finally.ReThrow.test(ReThrow.java:18)
    ... 2 more

原文地址:https://www.cnblogs.com/liudaihuablogs/p/9259763.html

时间: 2024-08-30 11:18:13

第十二章 重新抛出异常与异常链的相关文章

Java编程思想---第十二章 通过异常处理错误(中)

第十二章  通过异常处理错误(中) 12.4 创建自定义异常 我们不必拘泥于Java中已有的异常类型,Java提供的异常体系不可能预见所有的错误,所以可以自己定义异常类来表示程序中可能会遇到的特定问题:要自己定义异常类,必须从已有的异常类继承,最好是选择意思相近的异常类继承,建立新的异常类最简单的方法就是让编译器为你产生默认构造器,所以这几乎不用写多少代码: class SimpleException extends Exception { } public class InheritingEx

第十二章 读书笔记

第十二章  Linux 驱动程序中的 阻塞和非阻塞 I/O 等待队列是 Linux 内核的一种实现进程休眠的技术.在上一章介绍的自旋锁使用的是不断循环 的方式阻塞 Linux 驱动,这种方式很占 CPU 资源.而等待队列的你眠技术可以大大降低休眠进程对 CPU 资源的消耗,信号量就是利用等待队列实现了对临界区的锁定.本节将介绍等待队列的原 理以及相关的函数和宏,最后会使用一个完整的例子来演示如何使用等待队列休眠和唤醒进程. 运行在用户空间的应用程序可以使用 select函数检测设备文件是否可以读

Java学习笔记—第十二章 Java网络编程入门

第十二章  Java网络编程入门 Java提供的三大类网络功能: (1)URL和URLConnection:三大类中最高级的一种,通过URL网络资源表达方式,可以很容易确定网络上数据的位置.利用URL的表示和建立,Java程序可以直接读入网络上所放的数据,或把自己的数据传送到网络的另一端. (2)Socket:又称"套接字",用于描述IP地址和端口(在Internet中,网络中的每台主机都有一个唯一的IP地址,而每台主机又通过提供多个不同端口来提供多种服务).在客户/服务器网络中,当客

[CSAPP笔记][第十二章并发编程]

第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟悉的例子. 我们主要将并发看做是一种操作系统内核用来运行多个应用程序的机制. 但是,并发不仅仅局限于内核.它也可以在应用程序中扮演重要的角色. 例如 Unix信号处理程序如何允许应用响应异步事件 例如:用户键入ctrl-c 程序访问虚拟存储器的一个未定义的区域 其他情况 访问慢速I/O设备 当一个应

第十二章类的无参方法

一.javaDoc注释: 语法:/** * *@author FLC */ 生成javaDoc文档的步骤:点击File--Export--展开java文件夹--选择javaDoc--点击Next--制定生成doc文档的文件位置--点击Fish--找到生成文件位置查看. 二.类中的方法: 语法:   访问修饰符  方法返回值类型  方法名称(){} 例如: public void run(){ } public String ball(){ } String ball="球"; retu

第十二章随笔

第十二章,Android下综合项目介绍之一 随着社会电子信息化的不断发展,人们在居家中实验的电器越来越多,由此带来的安全隐患也越来越多,为了减少电器的不合理使用带来的异常情况,由此带来的安全隐患也有了明显的增多,为了减少电器的不合理使用带来的异常情况,就要求在异常发生时用户及时能得到消息,并通过实时监控采取一定的操作排除异常,因此 远程监控系统的作用是非常大的.仅用浏览器可观看,同事还具有以下优点.布控局域广阔,嵌入式视频WEB服务器监控系统WEB服务器直接连人网络,没有线缆长度和信号衰减的限制

【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程

原文:[.NET Core项目实战-统一认证平台]第十二章 授权篇-深入理解JWT生成及验证流程 [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了基于Ids4密码授权模式,从使用场景.原理分析.自定义帐户体系集成完整的介绍了密码授权模式的内容,并最后给出了三个思考问题,本篇就针对第一个思考问题详细的讲解下Ids4是如何生成access_token的,如何验证access_token的有效性,最后我们使用.net webapi来实现一个外部接口(本来想用JAVA来实现的,

20190925 On Java8 第二十二章 枚举

第二十二章 枚举 基本 enum 特性 创建 enum 时,编译器会为你生成一个相关的类,这个类继承自 Java.lang.Enum. valueOf() 是在 Enum 中定义的 static 方法,它根据给定的名字返回相应的 enum 实例,如果不存在给定名字的实例,将会抛出异常. 将静态类型导入用于 enum 使用 static import 能够将 enum 实例的标识符带入当前的命名空间,所以无需再用 enum 类型来修饰 enum 实例. 方法添加 除了不能继承自一个 enum 之外

C和指针 (pointers on C)——第十二章:使用结构和指针

第十二章 使用结构和指针 这章就是链表.先单链表,后双向链表. 总结: 单链表是一种使用指针来存储值的数据结构.链表中的每个节点包含一个字段,用于指向链表的下一个节点. 有一个独立的根指针指向链表的第1个节点.单链表只能从一个方向遍历. 如何insert单链表:1.新节点的link字段必须设置为指向它的后面节点.2.前一个节点的link字段必须指向这个新节点. 为了防止可能会插入链表的起始位置这种情况,在C中,可以保存一个指向必须进行修改的link字段的指针,而不是保存一个指向前一个节点的指针.