为什么 Eclipse 调试器不会在范围内的异常断点处停止(如何在已处理的异常处停止)
Why Eclipse Debugger does not stop on scoped exception breakpoint (how to stop on handled exception)
我正在使用 Eclipse Luna(也在 Kepler 中测试过,所以不是特定于版本的)。 运行 关于 JDK 1.8_40。
我想找到有 "eaten" 个例外的地方 - 例如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 ");
}
}
在调试 Eclipse 之后,我了解到 "scope" 过滤器应该匹配抛出位置(在本例中为 java.math.BigDecimal)而不是捕获位置。
这是在 "scope" 上过滤的原始 JVM 调试器,但是 JVM 将过滤器限制为一项(class 或包),而 Eclipse 可以处理多项。
在 Eclipse 中执行过滤的代码在 class
org.eclipse.jdt.internal.debug.core.breakpoints.JavaExceptionBreakpoint
可以更新包含此 class 的 JAR - 因此 "uncaught exceptions" 会将范围与抛出位置相关联,而 "caught exceptions" 将范围与捕获位置相关联 [我发现此行为最有用]
下面的更改就是这样做的——也许有人会在 Eclipse 中实现:
public boolean handleBreakpointEvent(Event event, JDIThread thread, boolean suspendVote)
...
Location location = ((ExceptionEvent)event).catchLocation();
if (location == null) {
location = ((ExceptionEvent)event).location();
}
我正在使用 Eclipse Luna(也在 Kepler 中测试过,所以不是特定于版本的)。 运行 关于 JDK 1.8_40。 我想找到有 "eaten" 个例外的地方 - 例如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 ");
}
}
在调试 Eclipse 之后,我了解到 "scope" 过滤器应该匹配抛出位置(在本例中为 java.math.BigDecimal)而不是捕获位置。
这是在 "scope" 上过滤的原始 JVM 调试器,但是 JVM 将过滤器限制为一项(class 或包),而 Eclipse 可以处理多项。
在 Eclipse 中执行过滤的代码在 class
org.eclipse.jdt.internal.debug.core.breakpoints.JavaExceptionBreakpoint
可以更新包含此 class 的 JAR - 因此 "uncaught exceptions" 会将范围与抛出位置相关联,而 "caught exceptions" 将范围与捕获位置相关联 [我发现此行为最有用]
下面的更改就是这样做的——也许有人会在 Eclipse 中实现:
public boolean handleBreakpointEvent(Event event, JDIThread thread, boolean suspendVote)
...
Location location = ((ExceptionEvent)event).catchLocation();
if (location == null) {
location = ((ExceptionEvent)event).location();
}