9

当我的代码中抛出未捕获的异常时,我习惯于让调试器在抛出语句处停止,以便在抛出异常时检查局部变量和所有涉及的对象的成员。使用IntelliJ Idea,这可以通过转到RunView Breakpoints、选择Exception Breakpoints选项卡、选中Any exception并确保未选中Caught exception复选框,同时选中Uncaught exception复选框来完成。对于EclipseVisual Studio(用于 C#),情况有所不同,但思路相同。

让调试器以这种方式运行的能力非常有用;实际上非常有用,以至于我相应地构建了程序的主循环:在发布版本上,主循环当然嵌入在 try-catch-all 中;但是在调试版本中,主循环中没有 try-catch 块,因此任何在我的程序中任何地方都没有被捕获的异常都将保持未被捕获,这样调试器就会在它们被抛出的那一刻暂停我的程序。

但是,在使用 JUnit 测试我的 Java 类时,我遇到了一个问题:调试器不会因任何异常而停止。相反,发生的事情不仅是预期的异常,而且意外的异常也会自动捕获,并且我会得到一个事后异常堆栈跟踪,以尝试理解。这不是很酷。

我曾经认为发生这种情况是因为JUnit使用,java.lang.reflect.Method.invoke()它捕获所有异常并将它们转换为. 这意味着问题出在核心 JUnit 内部。TargetInvocationExceptionsMethod.invoke()

那么,其他人有同样的问题吗?有谁知道一个解决方案,以便我们可以让调试器在使用 JUnit 进行测试时暂停程序执行意外异常?

相关(未回答)问题:在 Eclipse Junit 测试运行程序中暂停未捕获的运行时异常

相关(未回答)问题:如何在 jUnit 测试用例中闯入调试器?

相关(部分回答)问题:Break on Exception in Eclipse using jUnit(接受的答案说“如果您在 jUnit 中调试单个方法,则断点开始工作。如果在 jUnit 中调试整个类或包,则调试器不会不行。”)

4

2 回答 2

1

我希望我能正确理解这个问题,如果我错了,请纠正我,但是:

  • 你有一个测试,它抛出了一个你自己没有发现的异常(所以从这个意义上说,它是未被捕获的)
  • 当您使用 JUnit4 测试运行程序调试此测试时,JUnit 会向您显示测试失败(它引发了异常)
  • 但是线程没有挂起,这是你想要实现的
  • 即使您preferences | java | debug | suspend execution on uncaught exceptions启用了

在这种情况下,我相信这是预期的行为,JUnit 会捕获并吞下您的异常,因此就 eclipse 而言,它并非未被捕获,如此处所述https://bugs.eclipse.org/bugs/show_bug.cgi?编号=414133

您可以通过设置自己的规则来暂停捕获的异常,从而以任何方式暂停 Eclipse。Debug perspective | breakpoint view | J! icon | check suspend on caught exception

于 2015-06-11T14:28:44.597 回答
0

As a workaround for use when investigating a test failure, you could create an instance of the offending test class in main method and call its test method by hand with your exception breakpoints method (which is very cool by the way, thanks for the question). That way, the method isn't being called reflectively.

于 2012-11-28T19:34:10.797 回答