【问题标题】:Find an exception that gets caught away找到一个被捕获的异常
【发布时间】:2015-10-18 18:39:47
【问题描述】:

原问题

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

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

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

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

解释为什么我选择了最佳答案,还有什么可能有帮助

诚的回答:

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

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

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

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

还有 Pinkie Swirl 的评论:

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

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

【问题讨论】:

  • 如果您无法更改代码,您唯一的机会是使用调试器并在 catch 块内设置断点。但除此之外,如果不更改代码,您将永远不会看到该异常

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


【解决方案1】:

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() 是否绝对保证在其执行期间抛出异常。

【讨论】:

  • 请注意,通过调试仍然可以看到 e 及其信息(堆栈跟踪等)。
  • @PinkieSwirl:是的,但是catch 内部的任何语句都没有与e 有任何关系。它有效地落在地板上。
  • 是的,我知道,只是想补充一点,如果 OP 可以选择这样做,因为他没有在他的问题中指定。
  • @PinkieSwirl 如果调试是指在m() 中插入或更改任何内容,那么不会。但我可以选择监视执行m()Thread。有什么我可以做的吗?是否有可能得到Thread 中最后一个抛出的Exception 或当前被抓到的那个?
  • 调试是指以调试方式执行代码,例如,您可以设置断点并逐步执行代码。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多