给定以下方法是库的一部分(因此无法编辑)(同样,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,所以我真的需要知道解决我的问题是什么)。
答案 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语句中的类或其他条件。