【问题标题】:Why Eclipse Debugger does not stop on scoped exception breakpoint (how to stop on handled exception)为什么 Eclipse 调试器不会在作用域异常断点上停止(如何在处理的异常上停止)
【发布时间】:2015-08-24 12:49:08
【问题描述】:

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

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

如何使这项工作或任何解决方法/替代方案?找出您的代码正在捕获的内容很方便,而不是查看所有库代码异常处理。

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

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

API 描述说它应该可以正常工作(为每次抛出找到一个相关的捕获): http://docs.oracle.com/javase/8/docs/jdk/api/jpda/jdi/com/sun/jdi/event/ExceptionEvent.html#catchLocation--

我可以看到这可能与 Java 调试接口本身有关 从很久很久以前 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 ");
  }
}

【问题讨论】:

标签: java eclipse debugging exception


【解决方案1】:

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

这是原始的 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();
    }

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 2014-04-12
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 2023-03-12
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多