当我的代码中抛出未捕获的异常时,我习惯于让调试器停在抛出语句处,以便我可以检查异常抛出时涉及的所有对象的成员和本地变量。使用IntelliJ Idea可以通过转到“运行”,“查看断点” ,选择“异常断点”选项卡,勾选“任何异常”,并确保“已捕获异常”复选框未选中,而“未捕获异常”复选框已选中来实现这一点。对于Eclipse和Visual Studio(用于C#),则有所不同,但大致相同。
具有这种方式调试器的能力非常有用;事实上,它非常有用,以至于我根据此结构化程序的主循环:在发布版本中,主循环当然嵌入在try-catch-all中;但在调试版本中,在主循环中没有try-catch块,因此任何未在程序内部任何位置捕获的异常都将保持未捕获状态,以便调试器会在抛出异常的那一刻暂停我的程序。
然而,在使用JUnit测试我的Java类时,我遇到了一个问题:调试器不会在任何异常上停止。相反,发生的是不仅捕获预期的异常,而且自动地捕获未预期的异常,并给我一个死后异常堆栈跟踪,以尝试理解。这不太好。
我曾经认为这是因为JUnit使用java.lang.reflect.Method.invoke(),该方法捕获所有异常并将它们转换为TargetInvocationExceptions,但然后我编写了自己的自定义JUnit运行器,该运行器了解我的测试类并直接调用其方法而没有Method.invoke(),但问题仍然存在。这意味着问题在核心JUnit中高度存在。
那么,还有其他人遇到同样的问题吗?是否有人知道解决方案,以便我们可以在使用JUnit进行测试时暂停程序执行在未预期的异常上?
相关(未回答)问题:Eclipse Junit测试运行器上未捕获的运行时异常挂起 相关(未回答)问题:如何在jUnit测试用例中中断调试器? 相关(部分回答)问题:在Eclipse中使用jUnit中断异常(被接受的答案说:“如果您在jUnit中调试单个方法,则断点开始工作。如果在jUnit中调试整个类或包,则调试器不起作用。)”
具有这种方式调试器的能力非常有用;事实上,它非常有用,以至于我根据此结构化程序的主循环:在发布版本中,主循环当然嵌入在try-catch-all中;但在调试版本中,在主循环中没有try-catch块,因此任何未在程序内部任何位置捕获的异常都将保持未捕获状态,以便调试器会在抛出异常的那一刻暂停我的程序。
然而,在使用JUnit测试我的Java类时,我遇到了一个问题:调试器不会在任何异常上停止。相反,发生的是不仅捕获预期的异常,而且自动地捕获未预期的异常,并给我一个死后异常堆栈跟踪,以尝试理解。这不太好。
我曾经认为这是因为JUnit使用java.lang.reflect.Method.invoke(),该方法捕获所有异常并将它们转换为TargetInvocationExceptions,但然后我编写了自己的自定义JUnit运行器,该运行器了解我的测试类并直接调用其方法而没有Method.invoke(),但问题仍然存在。这意味着问题在核心JUnit中高度存在。
那么,还有其他人遇到同样的问题吗?是否有人知道解决方案,以便我们可以在使用JUnit进行测试时暂停程序执行在未预期的异常上?
相关(未回答)问题:Eclipse Junit测试运行器上未捕获的运行时异常挂起 相关(未回答)问题:如何在jUnit测试用例中中断调试器? 相关(部分回答)问题:在Eclipse中使用jUnit中断异常(被接受的答案说:“如果您在jUnit中调试单个方法,则断点开始工作。如果在jUnit中调试整个类或包,则调试器不起作用。)”
throw
指令在抛出未捕获的异常时像断点一样行为的问题。 - Mike Nakis