ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 查找被抓住的异常

2019-06-23 14:48:05  阅读:280  来源: 互联网

标签:java exception try-catch stack-trace throw


原始问题

给定以下方法是库的一部分(因此无法编辑)(另外,A()是私有的,因此不能在m()之外调用):

void m() {
    try {
        A();
    } catch (Exception e) {
        B();
        throw e;
    }
}

当调用m()时,A()生成异常e,因此执行B().但是,B()也抛出一个异常,然后向上传递(而不是e,稍后将向上传递一行).

是否有可能找到例外e?也许使用一些智能反射或多线程暂停和走动的方法?

解释为什么我选择了最佳答案,以及其他什么可能有用

Makoto的回答:

e is lost because any exception that is thrown will cause execution to complete abruptly.

是我的问题的正确答案(即,无法以编程方式检索异常e).

但是,我想指出肖恩·帕特里克·弗洛伊德的评论:

If you can’t change the code, your only chance is to use a debugger and set a breakpoint inside the catch block.

和Pinkie Swirl的评论:

Note that through debugging one could still see e and its information (stack trace etc..)

实际上帮助我解决了我的问题:通过调试器(我得到的异常是一个SQLException,所以我真的需要知道解决我的问题是什么).

解决方法:

e丢失,因为抛出的任何异常都会导致执行到complete abruptly.

考虑这个(有效代码):

void m() throws Exception {
    try {
        A();
    } catch (Exception e) {
        B();
        throw e;
    }
}

private void B() {
    throw new RuntimeException("No!!!!");
}

private void A() throws Exception {
    throw new RuntimeException("Do I make it??");
}

调用B()的语句将导致整个方法m()突然完成,因为抛出了异常.这意味着此当前代码块中的任何内容都不能再访问e.

从另一个角度来看,如果你要翻转catch中的语句顺序……

void m() throws Exception {
    try {
        A();
    } catch (Exception e) {
        throw e;
        B();
    }
}

…对B()的调用将被视为无法访问,因为编译器可以保证永远不会执行B().同样的事情发生在这里,但需要注意的是编译器无法确定B()是否绝对保证在执行期间抛出异常.

标签:java,exception,try-catch,stack-trace,throw
来源: https://codeday.me/bug/20190623/1271899.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有