为什么Eclipse Debugger不会在作用域异常断点上停止(如何停止处理的异常)

时间:2015-06-09 15:30:03

标签: java eclipse debugging exception

我正在使用Eclipse Luna(在Kepler中测试过,因此不是特定于版本的)。在JDK 1.8_40上运行。 我想找到有“吃掉”例外的地方 - 例如使用try / catch块进行不正确的处理。

以下示例代码。当我将异常断点设置为图片时,e.printStackTrace()不会因异常而停止。

如何使这项工作或任何变通方法/替代方案?找出代码捕获的内容很方便,而且看不到所有库代码异常处理。

注意:当然,如果我们删除范围,它将在BigDecimal中不正确地停止。引发异常的地方,以及main()执行期间的任何其他异常 - 在这种情况下是一些ClassNotFoundException s

常识说它是一个被捕获的位置,范围匹配和异常类型(子类型)。

API描述说它应该正常工作(对于每个throw找到一个相关的catch): http://docs.oracle.com/javase/8/docs/jdk/api/jpda/jdi/com/sun/jdi/event/ExceptionEvent.html#catchLocation--

我可以看到这可能与Java Debugging接口本身有关 从很久很久以前的java 1.4开始 - 但不确定在以下时间吃了多少个事件:

https://bugs.openjdk.java.net/browse/JDK-4515254

package test.me;

import java.math.BigDecimal;

public class EatExceptionBreakpoint {

  public static void main(String[] args) {
    try {
        new BigDecimal("10 "); // how to make Exception Breakpoint to stop ?
    } catch (Exception e) {
        e.printStackTrace();
    }

    new BigDecimal("20 ");
  }
}

enter image description here

1 个答案:

答案 0 :(得分:0)

在调试Eclipse之后我理解“范围”过滤器应该匹配抛出位置(在本例中为java.math.BigDecimal)而不是catch位置。

这是对“scope”的原始JVM调试器过滤,但是JVM将过滤器限制为一个项目(类或包),而Eclipse可以处理多个项目。

在Eclipse中进行过滤的代码在类

org.eclipse.jdt.internal.debug.core.breakpoints.JavaExceptionBreakpoint

包含此类的JAR可以更新 - 因此“未捕获的异常”将范围与抛出位置相关联,而“捕获异常”将范围与捕获位置相关[我发现此行为最有用]

以下更改是这样做的 - 也许有人会在Eclipse中实现:

public boolean handleBreakpointEvent(Event event, JDIThread thread, boolean suspendVote)
    ...
    Location location = ((ExceptionEvent)event).catchLocation();
    if (location == null) {
           location = ((ExceptionEvent)event).location();
    }