Java-- 重新抛出异常

 有时希望把刚捕获的异常重新抛出,尤其是在使用Exception捕获的异常的时候。既然已经得到了对当前异常对象的引用,可以直接把它重新抛出:

catch(Exception e){

  Systyem.out.println(“An exception was thrown”);

  throw e;

}

重抛异常会把异常抛给上一级环境中的异常处理程序,同一个try块的后续catch子句将被忽略。此外,异常对象的所有信息都得以保持,所以高一级环境中捕获此异常的

处理程序可以从这个异常对象中得到所有信息。

  如果只是把当前异常对象重新抛出,那么printStackTrace()方法显示的将是原来的异常的抛出点的调用堆栈信息,而并非重新抛出点的信息。要想更新这个信息,可以调用fillInStackTrace()方法,这将返回一个Throwable对象,它是通过把当前调用栈信息填入原来那个异常对象建立的,如下:

 1 package com.exceptions;
 2
 3
 4 public class Rethrowing {
 5
 6     public static void f() throws Exception{
 7         System.out.println("originating the exception in f()");
 8         throw new Exception("throw from f()");
 9     }
10
11     public static void g() throws Exception{
12         try{
13             f();
14         }catch(Exception e){
15             System.out.println("Inside g(), e.printStackTrace()");
16             e.printStackTrace(System.out);
17             throw e;
18         }
19     }
20
21     public static void h() throws Exception{
22         try{
23             f();
24         }catch(Exception e){
25             System.out.println("Inside h(), e.printStackTrace()");
26             e.printStackTrace(System.out);
27             throw (Exception)e.fillInStackTrace();
28         }
29     }
30     public static void main(String[] args) {
31         // TODO Auto-generated method stub
32         try{
33             g();
34         }catch(Exception e){
35             System.out.println("main: printStackTrace()");
36             e.printStackTrace(System.out);
37         }
38         try{
39             h();
40         }catch(Exception e){
41             System.out.println("main: printStackTrace()");
42             e.printStackTrace(System.out);
43         }
44     }
45
46 }

结果:

 1 originating the exception in f()
 2 Inside g(), e.printStackTrace()
 3 java.lang.Exception: throw from f()
 4     at com.exceptions.Rethrowing.f(Rethrowing.java:8)
 5     at com.exceptions.Rethrowing.g(Rethrowing.java:13)
 6     at com.exceptions.Rethrowing.main(Rethrowing.java:33)
 7 main: printStackTrace()
 8 java.lang.Exception: throw from f()
 9     at com.exceptions.Rethrowing.f(Rethrowing.java:8)
10     at com.exceptions.Rethrowing.g(Rethrowing.java:13)
11     at com.exceptions.Rethrowing.main(Rethrowing.java:33)
12 originating the exception in f()
13 Inside h(), e.printStackTrace()
14 java.lang.Exception: throw from f()
15     at com.exceptions.Rethrowing.f(Rethrowing.java:8)
16     at com.exceptions.Rethrowing.h(Rethrowing.java:23)
17     at com.exceptions.Rethrowing.main(Rethrowing.java:39)
18 main: printStackTrace()
19 java.lang.Exception: throw from f()
20     at com.exceptions.Rethrowing.h(Rethrowing.java:27)
21     at com.exceptions.Rethrowing.main(Rethrowing.java:39)

Java-- 重新抛出异常

时间: 2024-10-16 05:01:12

Java-- 重新抛出异常的相关文章

java 重新抛出异常 相关处理结果示例代码

package org.rui.ExceptionTest; /** * 重新抛出异常 * 在某些情况下,我们想重新掷出刚才产生过的违例,特别是在用Exception 捕获所有可能的违例时.由于我 们已拥有当前违例的句柄,所以只需简单地重新掷出那个句柄即可.下面是一个例子: catch(Exception e) { System.out.println("一个违例已经产生"); throw e; } 重新"掷"出一个违例导致违例进入更高一级环境的违例控制器中.用于同

简述java中抛出异常的两种方式

java编程中经常遇到异常,这时就需要利用java中的异常抛出机制,在java中提供了两种抛出异常的方法:try{}  catch() {}和throw. 一.抛出异常的两种方式 (1) 首先我们来看一下try()  catch(){}这种方式: ? 1 2 3 4 5 6 try{    i=9\0; } catch(exception e) {     system.out.println("除数不能为0"): } 该种方式是将待执行的代码放入try中,如果执行的代码发生异常就会被

述java中抛出异常的两种方式

java编程中经常遇到异常,这时就需要利用java中的异常抛出机制,在java中提供了两种抛出异常的方法:try{}  catch() {}和throw. 一.抛出异常的两种方式 (1) 首先我们来看一下try()  catch(){}这种方式: ? 1 2 3 4 5 6 try{    i=9\0; } catch(exception e) {     system.out.println("除数不能为0"): } 该种方式是将待执行的代码放入try中,如果执行的代码发生异常就会被

java 保护内存操作的方法

1.与c++不同,在java中,没有通过使用强制转换指针类型或者通过进行指针运算直接访问内存的方法.在java中使用对象时,需要严格地遵守类型规则.如果存在一个Mountain类对象的引用(类似于c++的指针),它只能作为Mountain使用.这个引用不能强制转换为Lava类型,更不能把它转为Lava类型,更不能把它所指向的内存假设为一个Lava对象来操作.像C++中使用指针运算那样,简单地给引用加上偏移量也是被禁止的.在java中,将一个引用转换成别的类型也是可以的,但只能在此对象的确为这种新

Java核心API -- 9(异常)

异常处理 异常结构中的父类Throwable类,其下子类Exceptionlei类和Error类.我们在程序中可以捕获的是Exception的子类异常. Error系统级别的错误:Java运行时环境出现的错误,我们不可控. Exception是程序级别的错误:我们可控. 1)捕获异常两种方式: 一是添加try-catch捕获该异常,二是在我们的方法中声明出也追加这种异常的抛出(继续往外抛). 2)异常处理语句:try-catch,如果try块捕获到异常,则到catch块中处理,否则跳过忽略cat

JAVA 进阶 异常

异常:程序在运行过程中发生由于硬件设备问题.软件设计错误等导致的程序异常事件. 世上没有百分之百完美的程序.程序总难免存在各式各样的问题.所以,程序中添加对于错误的处理机制是十分有必要的.这就好比人多的公共场所需要有防火防盗的安保系统一个道理. 捕获异常 异常处理格式 try {     // 有可能出现异常的语句 } catch (Type1 e1) {     // 异常类型1处理代码 } catch (Type2 e2) {     // 异常类型2处理代码 }  // etc... ca

Java千百问_04异常处理(007)_常见的java异常有哪些(非运行时)

点击进入_更多_Java千百问 1.常见的java运行时异常有哪些 了解非运行时异常看这里:什么是java中的异常 常见的运行时异常看这里:常见的运行时异常有哪些 我们所说的常见异常是jdk或者其他常用第三方jar中的异常,出现频次很高的异常.常见的非运行时异常(即检查异常,checked exception)包括: 操作数据库异常:SQLException 输入输出异常:IOException 文件未找到异常:FileNotFoundException 反射操作异常:ReflectiveOpe

JAVA基础知识点总结(全集)

1.JAVA简介 1.1java体系结构:j2se,javaweb,j2ee 1.2java特点:平台无关(虚拟机),垃圾回收(使得java更加稳定) 1.3 JDK与JRE,JDK:java开发环境,JRE:java运行环境 1.4第一个java程序:HelloWorld,java的入口是main(public static void main(String[] args)) 1.5java程序的开发步骤:.java编译(javac)成.class运行(java).class文件 2.基本数据

JAVA异常基础理论

任何程序都追求正确有效的运行,除了保证我们代码尽可能的少出错之外,我们还要考虑如何有效的处理异常,一个良好的异常框架对于系统来说是至关重要的.最近在给公司写采集框架的时候系统的了解一边,收获颇多,特此记录相关的理论. 1 . 异常体系简介: 异常是指由于各种不期而至的情况,导致程序中断运行的一种指令流,如:文件找不到.非法参数.网络超时等.为了保证正序正常运行,在设计程序时必须考虑到各种异常情况,并正确的对异常进行处理.异常也是一种对象,java当中定义了许多异常类,并且定义了基类java.la

java虚拟机规范阅读(一)简介

java虚拟机规范在日常工作中可以说根本用不到,但作为一个完美主义者,感觉如果进入java这个行业,对它的方方面面不去掌握的话,未免有些遗憾,我没有那些改写java语言大师们的天赋,我只能站在他们的肩膀,来掌握他们创造的技术. 闲话不多说,我会认真读java虚拟机并写下自己理解或者有用的东西,看到的.写下的.说出的才是学到的,读者可以去http://down.51cto.com/自行下载java虚拟机规范. 关于java虚拟机规范: 本规范描述的是一种抽象化的虚拟机的行为,而不是任何一种(译者注