4.异常捕获后再次抛出

  • 4.异常捕获后再次抛出

  • 情况一:捕获后抛出原来的异常,希望保留最新的异常抛出点--fillStackTrace

  • 情况二:捕获后抛出新的异常,希望抛出完整的异常链--initCause

  • 1.捕获后重新抛出捕获的异常
  • 在函数中捕获了异常,在catch模块中不做进一步的处理,而是向上一级进行传递
  • catch(Exception e){
  • throw e;
  • }
public class ReThrow {
    public static void f()throws Exception{
        throw new Exception("Exception: f()");
    }

    public static void g() throws Exception{
        try{
            f();
        }catch(Exception e){
            System.out.println("inside g()");
            throw e;
        }
    }
    public static void main(String[] args){
        try{
            g();
        }
        catch(Exception e){
            System.out.println("inside main() function");
            e.printStackTrace(System.out);
        }
    }
}

运行结果如下:

inside g()

inside main() function

java.lang.Exception: Exception: f()

at ReThrow.f(ReThrow.java:6)   //异常的抛出点还是最初抛出异常的函数f()

at ReThrow.g(ReThrow.java:11)

at ReThrow.main(ReThrow.java:19)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

  • 2.fillStackTrace——覆盖前边的异常抛出点(获取最新的异常抛出点)
  • 在此抛出异常的时候进行设置
  • catch(Exception e){
  • (Exception)e.fillInStackTrace();
  • }
public static void g() throws Exception{
    try{
        f();
    }catch(Exception e){
        System.out.println("inside g()");
        throw (Exception)e.fillInStackTrace();
    }
}

运行结果如下:

inside g()

inside main() function

java.lang.Exception: Exception: f()

at ReThrow.g(ReThrow.java:14)         //显示的就是最新的抛出点

at ReThrow.main(ReThrow.java:19)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

  • 3.捕获异常后抛出新的异常( 区别于捕获异常之后重新抛出)
  • 方式1:Exception e=new Exception();----important
  • e.initCause(ex);
  • 方式2:
  • Exception e =new Exception(ex);
  • public void f(){
        try{
             g();//throws NullPointException
         }catch(NullPointException ex){
             ex.printStasckTrace();
             Exception e=new Exception();
             e.initCause(ex);//就可以看到原始的异常保留下来
             throw e;
         }
    }
  • 运行结果:
  • java.lang.Exception
  • at Main.g(Main.java:14)
  • at Main.main(Main.java:22)
  • at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  • at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  • at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  • at java.lang.reflect.Method.invoke(Method.java:606)
  • at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
  • Caused by: java.lang.NullPointerException
  • at Main.f(Main.java:6)
  • at Main.g(Main.java:11)
  • ... 6 more
时间: 2024-12-12 00:51:26

4.异常捕获后再次抛出的相关文章

异常捕获处理与抛出

1 public int insert(String user_id,String u_name,String u_pwd,String u_phone,String u_address,String u_sex,String u_birthday) throws Exception{ 2 String sql="insert into user(user_id,u_name,u_pwd,u_phone,u_address,u_sex,u_birthday)" +"value

.net mvc中AOP 异常捕获后返回自定义的Json

.net mvc中封装了一些特性可以实现AOP,如常用的HandleErrorAttribute,ActionFilterAttribute,AuthorizeAttribute.自定义一个特性,继承这些特性,并重写里面的方法就可以AOP切入到Action中的关注点.本篇文章主要对笔者在使用HandleErrorAttribute的过程中遇到的一个问题进行分享. 我们在action中会用try..catch..进行异常处理,笔者在catch中返回一个json(标示失败).我发现所有的action

异常CLRDBG_NOTIFICATION_EXCEPTION_CODE( 0x04242420)的抛出过程

新建一个c#控制工程,就用自动生成的代码,不用补任何代码,如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { } } } 工程配置如下 编译,在windbg里加载运行 当调试器中断时,在事件过滤器里添加异常0

捕获程序未抛出的异常

这段时间,Unity项目遇到问题,工程中有很多有问题的代码,调试的时候,这些代码理应抛出异常但是却没有,这是一个很恐怖的事情,因为你根本不知道你代码中有哪些不对,程序运行下来,就会遇到各种逻辑问题,查无对策.后来我研究了下,记录了下来 在unity中,子线程下的异常,如果不加try catch,可能不会被unity正常捕获,故而你会不知道这里有异常 先举个栗子 Thread t1,t2; List<int> list = null; void Start () { try { t1 = new

怎样自定义一个异常(报错) 并抛出

1. 自定义一个异常需要使用构造函数 Error() var error1 = new Error("This is an unknown error."); 2. 抛出异常需要使用 throw 关键字 var error1 = new Error("This is an unknown error."); throw error1; 执行后就可以得到这样的效果: 原文地址:https://www.cnblogs.com/aisowe/p/11655006.html

用C#用C#实现窗体在规定时间弹出,例如:10:00.弹出后关闭。并在5分钟后再次弹出。5次后停止。最好有具体代码实现窗体在规定时间弹出,例如:10:00.弹出后关闭。并在5分钟后再次弹出。5次后停止。最好有具体代码

run(){        while(true)        {                show();                if(条件)                {                        break:                }                sleep(5*60*1000);//暂停5分钟        }}thread Brun(){        while(true)        {               

Java throw:异常的抛出怎么回事

到目前为止,你只是获取了被Java运行时系统抛出的异常.然而,程序可以用throw语句抛出明确的异常.Throw语句的通常形式如下:    throw ThrowableInstance;这里,ThrowableInstance一定是Throwable类类型或Throwable子类类型的一个对象.简单类型,例如int或char,以及非Throwable类,例如String或Object,不能用作异常.有两种可以获得Throwable对象的方法:在catch子句中使用参数或者用new操作符创建.

异常抛出与捕获的思考

异常处理的思考 在java中异常分为两类.一.检查性异常.二.非检查性异常(运行时异常) 二者的区别:检查性异常需要显式try-catch或者throw.运行时异常可以不用捕获. 对于检查性异常由于必须捕获,所有并不需要太多的讨论(在设计异常的时候需要考虑).主要讨论运行时异常的抛出与捕获. 运行时异常的正确捕获和抛出,能够让系统代码更加简洁与rd只需要关系正常业务,对于不正常业务则交由异常处理. 现在存在的困扰: 1.每调用一个其他方法,都需要考虑与分析这个方法是不是存在异常,影响正常业务流程

Java中抛出的各种异常

目录(?)[-] 引子 JAVA异常 处理异常机制 捕获异常trycatch 和 finally try-catch语句 trycatch-finally语句 try-catch-finally 规则异常处理语句的语法规则 trycatchfinally语句块的执行顺序 抛出异常 throws抛出异常 使用throw抛出异常 Throwable类中的常用方法 Java常见异常 runtimeException子类 IOException 其他 自定义异常 1. 引子 try…catch…fina