当我的代码中抛出未捕获的异常时,我习惯让调试器停止在throw语句中,以便我可以检查局部变量以及抛出异常时所涉及的所有对象的成员。使用 IntelliJ Idea ,可以通过转到运行,查看断点,选择异常断点选项卡,检查来完成任何异常,并确保取消选中 Caught exception 复选框,同时选中 Uncaught exception 复选框。使用 Eclipse 和 Visual Studio (对于C#),它是不同的,但是沿着相同的路线。
使调试器以这种方式运行的能力非常有用;实际上非常有用,我相应地构建了我的程序的主循环:在发布版本中,主循环当然嵌入在try-catch-all中;但是在调试版本中,主循环中没有try-catch块,因此在我的程序中任何地方都没有捕获的任何异常都将保持未被捕获状态,因此调试器将在抛出它们时暂停我的程序。
但是,在使用JUnit测试我的Java类时,我遇到了一个问题:调试器不会在任何异常上停止。相反,发生的事情是,不仅预期的,而且意外的异常也会被自动捕获,并且我会获得一个事后异常堆栈跟踪以尝试理解。那不是很酷。
我曾经认为这种情况正在发生,因为JUnit使用java.lang.reflect.Method.invoke()
,它捕获所有异常并将它们转换为TargetInvocationExceptions
,但后来我编写了自己的自定义JUnit运行程序,它知道我的测试我亲自直接调用它的方法而没有Method.invoke()
,问题仍然存在。这意味着问题出现在核心JUnit中。
那么,其他人是否也有同样的问题?有没有人知道一个解决方案,以便我们可以让调试器在使用JUnit进行测试时暂停程序执行意外异常?
相关(未答复)问题:Suspend on uncaught runtime exceptions in Eclipse Junit test runner
相关(未答复)问题:How to break into debugger within a jUnit test case?
相关(部分回答)问题:Break on Exception in Eclipse using jUnit(接受的答案是“如果在jUnit中调试单个方法,断点就会开始工作。如果在jUnit中调试整个类或包,则调试器不起作用。“)
答案 0 :(得分:1)
我希望我能正确理解这个问题,如果我错了,请纠正我,但是:
preferences | java | debug | suspend execution on uncaught exceptions
在这种情况下,我认为这是预期的行为,JUnit会捕获并吞下你的异常,因此就eclipse而言,它并没有被捕获,如此处所述https://bugs.eclipse.org/bugs/show_bug.cgi?id=414133
您可以通过设置自己的规则来暂停捕获的异常,从而以任何方式暂停eclipse。 Debug perspective | breakpoint view | J! icon | check suspend on caught exception
答案 1 :(得分:0)
作为调查测试失败时使用的一种解决方法,您可以在main方法中创建一个违规测试类的实例,并使用您的异常断点方法手动调用其测试方法(顺便说一句,这非常酷,谢谢问题)。这样,该方法不会被反射调用。