2012-11-22 47 views
13

我一直在讀JLS,我遇到了我從中引用部分11.1.3. Asynchronous Exceptions:同步發生Java異步異常:我可以捕獲它們嗎?

大多數例外,通過在它們發生的 線程的行爲的結果,並在一個點指定的 程序可能導致此類異常。相反,一個異步 異常可能會發生在程序執行的任何一點的 處的異常。

而且

異步例外只發生作爲結果:

[...]

  • 在Java虛擬機內部錯誤或資源限制,防止它來自於實現Java編程語言的語義。在這種情況下,拋出的異步異常 是VirtualMachineError的子類的一個實例。

是否有可能趕上用於日誌記錄或通知這樣的例外(因爲我相信這樣的事情是不可恢復的)?我怎麼能做到這樣的事情?

回答

10

您可以像其他任何異常一樣捕獲這些異常。唯一的問題是它們可能發生在任何位置的程序中,因此難以可靠地捕獲它們。您基本上必須將所有線程的run方法和main方法包裝在try..catch塊中,但對於不受控制的線程(如Swing EDT或定時器線程等),您不能這樣做。

通常不推薦使用Error的任何子類,因爲JVM可能處於不穩定狀態,這可能會導致進一步的故障(例如在OutOfMemoryError的情況下,您甚至可能沒有足夠的內存異常處理)。但是,記錄會成爲我眼​​中捕獲Error的有效理由。

我建議的解決方案是使用setting it as the default exception handleruncaught exception handler。在這個處理程序中,如果它們沒有被代碼中的任何地方捕獲到,你將得到所有異常和錯誤,並且你可以嘗試記錄它們。

+0

對於任何想知道'try-catch'塊是否可以在'try'塊中,是的,你可以擁有它。 [相關代碼](http://ideone.com/stN75L)。 – Prasanth

+1

@Prasanth當然,'try..catch'可以在任何地方都可以正常使用,這包括嵌套'try'。例如,當然你也可以在另一個「catch」中有一個'try..catch'。 –

+0

我不明白添加'''try..catch''塊如何幫助捕獲這樣的異常。我有這種情況,並增加一個'內部'''try - catch'''沒有幫助我的情況。你能詳細說明一下嗎? @Prasanth @Philipp Wendler? –

3

有沒有因爲你沒有indecattion在該狀態下pogram是在點捕獲這些異常(的VirtualMachineError的子類)的點,關於虛擬機錯誤的文件saies:

Java虛擬機當 內部錯誤或資源限制阻止它實現本章中描述的語義時,實現將拋出一個對象,該對象是類VirtualMethodError的子類的一個實例 。 本規範不能預測可能遇到的內部錯誤或資源限制,可能會遇到 ,並且不能精確地報告它們何時可以報告

所以假設你在一個OutOfMemoryError或不明錯誤沒有太多可以做它得到的,而一旦你vritualmashine does not工作正常,你不能向用戶提供anyhelp爲你的程序的心不是正常的工作,以及,除了你有不知道它發生在什麼時間,地點和原因,因爲它不是由程序引起的代碼錯誤。