找到一个被抓住的异常

时间:2015-10-18 18:39:48

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

原始问题

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

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

在致电m()时,A()会生成Exception e,因此B()会被执行。但是,B()也会抛出一个异常,然后向上传递(而不是e,稍后会将其传递出去。)

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

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

Makoto的回答:

  

e丢失,因为抛出的任何异常都会导致执行突然完成。

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

但是,我想指出Sean Patrick Floyd的评论:

  

如果您无法更改代码,您唯一的机会是使用调试器并在catch块内设置断点。

和Pinkie Swirl的评论:

  

请注意,通过调试,仍然可以看到e及其信息(堆栈跟踪等)。

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

2 个答案:

答案 0 :(得分:3)

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()突然完成,因为抛出了异常。这意味着此当前代码块中的 nothing 不再可以访问e

从另一个角度来看,如果要翻转catch内的陈述顺序......

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

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

答案 1 :(得分:1)

在大多数调试器下,例如Intellij您可以在异常抛出时设置断点,而不是处理。

您还可以过滤该throw语句中的类或其他条件。