当我的代码中抛出未捕获的异常时,我习惯于让调试器在抛出语句处停止,以便在抛出异常时检查局部变量和所有涉及的对象的成员。使用IntelliJ Idea,这可以通过转到Run、View Breakpoints、选择Exception Breakpoints选项卡、选中Any exception并确保未选中Caught exception复选框,同时选中Uncaught exception复选框来完成。对于Eclipse和Visual Studio(用于 C#),情况有所不同,但思路相同。
让调试器以这种方式运行的能力非常有用;实际上非常有用,以至于我相应地构建了程序的主循环:在发布版本上,主循环当然嵌入在 try-catch-all 中;但是在调试版本中,主循环中没有 try-catch 块,因此任何在我的程序中任何地方都没有被捕获的异常都将保持未被捕获,这样调试器就会在它们被抛出的那一刻暂停我的程序。
但是,在使用 JUnit 测试我的 Java 类时,我遇到了一个问题:调试器不会因任何异常而停止。相反,发生的事情不仅是预期的异常,而且意外的异常也会自动捕获,并且我会得到一个事后异常堆栈跟踪,以尝试理解。这不是很酷。
我曾经认为发生这种情况是因为JUnit使用,java.lang.reflect.Method.invoke()
它捕获所有异常并将它们转换为. 这意味着问题出在核心 JUnit 内部。TargetInvocationExceptions
Method.invoke()
那么,其他人有同样的问题吗?有谁知道一个解决方案,以便我们可以让调试器在使用 JUnit 进行测试时暂停程序执行意外异常?
相关(未回答)问题:在 Eclipse Junit 测试运行程序中暂停未捕获的运行时异常
相关(未回答)问题:如何在 jUnit 测试用例中闯入调试器?
相关(部分回答)问题:Break on Exception in Eclipse using jUnit(接受的答案说“如果您在 jUnit 中调试单个方法,则断点开始工作。如果在 jUnit 中调试整个类或包,则调试器不会不行。”)