我正在使用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 ");
}
}
答案 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();
}