2012-11-28 221 views
8

当我的代码中抛出一个未捕获的异常时,我习惯于让调试器在throwing语句处停止,以便我可以检查本地变量以及所涉及的所有对象的成员抛出异常的时刻。随着IntelliJ IDEA的这可以通过将运行查看断点,选择异常实现断点选项卡,检查任何异常,并确保该捕捉到异常复选框是选中,而未捕获的异常复选框被选中。使用EclipseVisual Studio(对于C#),它有些不同,但沿着相同的路线。JUnit 4和异常挂起

使调试器以这种方式工作的能力非常有用;实际上非常有用,我相应地构建了我的程序的主循环:在发行版本上,主循环当然嵌入了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

您运行的是哪个版本的JUnit?我可以在我的测试中捕获未捕获的异常,Eclipse Indigo Build 20110615-0604,JUnit 4. – Perception

+2

我正在使用JUnit 4.8.1。请注意,这个问题不是捕捉未捕获的异常;这是关于让调试器暂停未捕获异常的程序执行。换句话说,如果抛出的异常是未捕获的,那么它的作用就像是一个断点。 –

+0

我想我不清楚。我的IDE(Eclipse Indigo)会自动暂停执行,如果我也告诉它,捕获/未捕获的异常。即使在运行JUnit 4测试时也是如此。 – Perception

回答

0

作为调查测试失败时使用的解决方法,您可以创建一个有问题的测试实例在主要方法和调用中的类它的测试方法与你的异常断点方法(这是非常酷的方式,谢谢你的问题)。那样的话,这个方法不会被称为反射式的。

+2

谢谢你的回复,但正如你所说,这不是一个真正的解决方案,它是一种解决方法。事实上,更容易到达抛出异常的行,(通过点击堆栈跟踪),在那里放置一个断点,然后重新运行。我只是想避免这样做。 –

1

我希望我理解正确的问题,所以纠正我,如果我错了,但:

  • 你有一个测试,抛出一个异常,你可以不抓自己(因此,在这个意义上说,是未捕获)
  • 在调试这个测试与JUnit4的TestRunner,JUnit的显示你的测试失败(它抛出异常)
  • 但线程未暂停,也就是你想达到
  • 什么
  • 即使您已启用preferences | java | debug | suspend execution on uncaught exceptions启用

在这种情况下,我相信这是预期的行为,JUnit的渔获物和燕子你的例外,所以它不是未捕获尽可能日食而言,这里描述的https://bugs.eclipse.org/bugs/show_bug.cgi?id=414133

你可以有日食暂停以任何方式设置您自己的规则以暂停捕获的异常。 Debug perspective | breakpoint view | J! icon | check suspend on caught exception

+0

你对这个问题的理解是正确的。然而,你提出的解决方案是行不通的,因为在我无法控制的代码中,在正常操作下的代码中,以及在我的代码中,都会抛出数千个异常(被捕获)错误检查和处理代码。 –

+0

我甚至无法使用类过滤器来至少处理java运行时抛出和捕获的异常,因为有时由java运行时抛出的异常会传播到我的代码中,并且我希望调试器在那里断开代码调用抛出的运行时方法,但Java调试器显然没有像Microsoft Visual Studio那样“仅在我的代码中断”的概念。 –

+0

嗯,我知道了,并且给出了我发布的链接,我猜你的最后一句话是正确的,eclipse调试器似乎没有只在你的代码中挂起的概念。这似乎让JUnit不会吞下你的例外作为你唯一的选择......我不知道这是否可能...... – Hirle