2012-11-28 227 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