重新抛出异常

如果我们直接重新抛出异常,那么当我们后续捕获此异常时并不会产生重新抛出地的信息。但是当我们需要重新抛出一个异常时我们显然希望能获得重新抛出点的信息,这时我们需要使用fillInStackTrace()方法,它通过把当前异常调用栈信息填入原来的异常对象而返回一个Throwable,所以我们需要将它强制转型为Exception再将其抛出。

import java.io.*;
class ExceptionTest{public static void fun1() throws IOException{throw new IOException("fun1()");}public static void fun2() throws IOException{throw new IOException("fun2()");}
}public class FuUse{/** invoke1()使用fillInstackTrace()方法抛出* */private static void invoke1() throws Exception{try {ExceptionTest.fun1();}catch (IOException e){/** 将异常调用栈轨迹信息重定向到System.out中* 默认是System.err。* */e.printStackTrace(System.out);/** e.fillInStackTrace()返回的是Throwable类型* */throw (Exception)e.fillInStackTrace();}}/** invoke2()直接重新抛出异常* */private static void invoke2() throws Exception{try {ExceptionTest.fun1();}catch (IOException e){e.printStackTrace(System.out);throw e;}}public static void main(String[] args){try {invoke1();} catch (Exception e) {e.printStackTrace(System.out);}System.out.println("----------------------------------");try {invoke2();} catch (Exception e) {e.printStackTrace(System.out);}}
}
/*
*output:
java.io.IOException: fun1()at ExceptionTest.fun1(FuUse.java:4)at FuUse.invoke1(FuUse.java:18)at FuUse.main(FuUse.java:49)
java.io.IOException: fun1()at FuUse.invoke1(FuUse.java:30)at FuUse.main(FuUse.java:49)
----------------------------------
java.io.IOException: fun1()at ExceptionTest.fun1(FuUse.java:4)at FuUse.invoke2(FuUse.java:39)at FuUse.main(FuUse.java:55)
java.io.IOException: fun1()at ExceptionTest.fun1(FuUse.java:4)at FuUse.invoke2(FuUse.java:39)at FuUse.main(FuUse.java:55)
* */

可以看到invoke2()中两个不同的抛出点都输出了通用的栈轨迹信息,而invoke1()中产生了重新抛出点的信息。

异常链

常常会在捕获一个异常后抛出另一个异常,并且希望把原始的异常信息保存下来,这被称为异常链。

这种情况可以举一个例子。比如针对用户来说,我们希望提供给他们的错误信息将细节隐藏,并使错误表达的简单明了。这时我们建立需要的自定义异常,在捕获到一些用户不需要知道的异常时,我们将用户易懂的自定义异常抛出(这种行为往往用来转换异常)。但是作为开发者我们需要知道异常发生的细节,现在就需要使用异常链的功能来实现。

import java.io.*;
/*
* 自定义异常WrongOperationException
* */
class WrongOperationException extends Exception{}class ExceptionTest{public static void fun() throws IOException{throw new IOException();}
}
public class FuUse{private static void invoke1() throws WrongOperationException{try {ExceptionTest.fun();}catch (IOException e){/** 将原异常对象设置为新异常对象的“原由”* initCase();* */WrongOperationException wrongOperation = new WrongOperationException();wrongOperation.initCause(e);throw wrongOperation;}}public static void main(String[] args){try {invoke1();} catch (WrongOperationException e) {e.printStackTrace(System.out);}}
}
/*
*output:
WrongOperationExceptionat FuUse.invoke1(FuUse.java:17)at FuUse.main(FuUse.java:26)
Caused by: java.io.IOExceptionat ExceptionTest.fun(FuUse.java:5)at FuUse.invoke1(FuUse.java:15)... 1 more
* */

当我们在捕获受查异常时,有时我们想在捕获到这个异常时不做处理直接终止程序。这时我们可以利用异常链的原理将受查异常当成非受查异常的原由。这就在形式上将受查异常转换成了非受查异常。

import java.io.*;
class ExceptionTest{public static void fun() throws IOException{throw new IOException();}
}
public class FuUse{private static void invoke1(){try {ExceptionTest.fun();}catch (IOException e){/** 将原异常对象设置为非受查异常对象的“原由”* */RuntimeException runtimeException = new RuntimeException();runtimeException.initCause(e);throw runtimeException;}}public static void main(String[] args){invoke1();}
}
/*
*output:
Exception in thread "main" java.lang.RuntimeExceptionat FuUse.invoke1(FuUse.java:16)at FuUse.main(FuUse.java:24)
Caused by: java.io.IOExceptionat ExceptionTest.fun(FuUse.java:4)at FuUse.invoke1(FuUse.java:11)... 1 more
* */

转载于:https://www.cnblogs.com/old-driver-lgq/p/10806271.html

重新抛出异常与异常链相关推荐

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

    java异常--捕获异常+再次抛出异常与异常链 参考文章: (1)java异常--捕获异常+再次抛出异常与异常链 (2)https://www.cnblogs.com/jpfss/p/9454592. ...

  2. java catch抛出异常_java异常——捕获异常+再次抛出异常与异常链

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java异常--捕获异常+再次抛出异常与异常链 的相关知识: [1]捕获异常相关 1.1)如果 ...

  3. 抛出运行时异常的目的_「JAVA」运行时异常、编译时异常、自定义异常,通过案例实践转译和异常链...

    Java基础之异常处理机制 什么是异常 从事Java开发的小伙伴对于"异常"应该不陌生,因为每天都会遇到不少异常,或捕获,或抛出.那究竟什么是异常?异常即非正常的,不同于平常.一般 ...

  4. python 抛出异常_python 异常

    目标 异常的概念 捕获异常 异常的传递 抛出异常 01. 异常的概念 程序在运行时,如果 Python 解释器 遇到 到一个错误,会停止程序的执行,并且提示一些错误信息,这就是 异常 程序停止执行并且 ...

  5. 爱上MVC~业务层刻意抛出异常,全局异常的捕获它并按格式返回

    对于业务层的程序的致命错误,我们一直的做法就是直接抛出指定的异常,让程序去终断,这种做法是对的,因为如果一个业务出现了致命的阻塞的问题,就没有必要再向上一层一层的返回了,但这时有个问题,直接抛异常,意 ...

  6. python3 抛出异常_Python3 异常

    一.错误 语法错误:使用 Pycharm 工具编写 Python 程序,编译器就会检测出来并给予提示,因此,编写好的程序几乎不会出现错误. 逻辑错误:编译器不会提示,例如:0作为被除数 二.异常 Py ...

  7. 中raise抛出异常_Ruby 异常

    Ruby 异常 异常和执行总是被联系在一起.如果您打开一个不存在的文件,且没有恰当地处理这种情况,那么您的程序则被认为是低质量的. 如果异常发生,则程序停止.异常用于处理各种类型的错误,这些错误可能在 ...

  8. java 在方法中抛出异常_Java异常的抛出

    在Java中,当定义的方法可能产生异常时,程序员必须抛出可能的异常. 抛出异常的两种方式,一是在方法内部用throw语句,二是在方法定义时用throws关键字 1.throw语句 在Java中,thr ...

  9. python抛出异常及异常传递

    抛出异常: Python程序中的异常不仅可以自动触发,还可以由开发人员使用raise语句和assert语句主动抛出. 使用raise语句抛出异常: 1.使用异常类引发异常 格式如下: raise 异常 ...

最新文章

  1. plot画图等高线contour 与 contourf 及API
  2. Tomcat启动 java.lang.OutOfMemoryError
  3. 空闲数据概念_计算机组成原理复习笔记——基础概念(二)
  4. c语言实现补码加减,C语言实现用位移运算符进行加减乘…
  5. 目标检测之行人检测(Pedestrian Detection)基于hog(梯度方向直方图)--- 梯度直方图特征行人检测、人流检测2...
  6. python语言程序设计实践教程答案实验六_20192417 实验一《Python程序设计》实验报告...
  7. 【转】路由转发过程的IP及MAC地址变化
  8. 程序清单8-9 回送所有命令行参数和所有环境字符串
  9. 「前端早读君007」css进阶之彻底理解视觉格式化模型
  10. moxy json介绍_MOXy作为您的JAX-RS JSON提供程序–服务器端
  11. webservice 参数太大_手把手系列:常用数据交换方案Web Service接口处理法
  12. php返回ajax必须是数组,ajax返回数组,页面接收不到数据
  13. 部署到gcp_将S/4部署在“大型公有云”上
  14. 一些简单的shell脚本实例
  15. 推荐 | 微软SAR近邻协同过滤算法解析(一)
  16. SecureCRT 下载安装与连接(转)
  17. 一文详解ERP的提取原理
  18. 如何在visio里将图形进行任意角度旋转
  19. Windows安装Redis并设置为开机启动
  20. 做个优秀的时间管理者

热门文章

  1. 英语采访问题之:你每天上班的动机是什么?
  2. 使用JDK自带的VisualVM进行Java程序的性能分析
  3. excel图表之道_学习笔记:Excel之图表布局
  4. python怎么只打印其中一行_如何在Python中让两个print()函数的输出打印在一行内?...
  5. 电脑f2还原系统步骤_使用冰点还原电脑每次重启都会还原,打造一个百毒不侵的系统...
  6. postgresql的特点_PG:PostgreSQL的一些简单操作
  7. 传递子类 java_Java,将主类传递给子类,错误的编码风格?
  8. Linux基本命令-1
  9. 集群机器时间同步设置
  10. c语言学生考勤系统课设报告,C语言课程设计总结报告学生考勤系统设计