【发布时间】:2012-11-28 18:12:07
【问题描述】:
当在我的代码中抛出未捕获的异常时,我习惯于让调试器在抛出语句处停止,以便在抛出异常的那一刻检查局部变量和所有涉及的对象的成员。使用 IntelliJ Idea,这可以通过转到 Run、View Breakpoints、选择 Exception Breakpoints 选项卡、检查任何异常,并确保未选中 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 中调试整个类或包,则调试器不会”不行。”)
【问题讨论】:
-
您运行的是什么版本的 JUnit?我可以很好地在测试中捕获未捕获的异常,Eclipse Indigo Build 20110615-0604,JUnit 4。
-
我使用的是 JUnit 4.8.1。请注意,这个问题不是关于捕获未捕获的异常;它是关于让调试器在未捕获的异常上暂停程序执行。换句话说,如果抛出的异常未被捕获,那么
throw指令的行为就像断点一样。 -
我想我不清楚。我的 IDE(Eclipse Indigo)在捕获/未捕获异常时自动暂停执行,如果我也告诉它的话。即使在运行 JUnit 4 测试时。
-
哦,我明白了。这很有趣,我会检查它,我会回复它。
-
@Perception 我无法确认您的观察。但是,我发现了一条新信息,并在答案的最后添加了它。 (运行整个测试套件与运行单个测试。)这是否符合您的观察?
标签: java debugging reflection exception-handling junit