2011-12-02 18 views
10

我想在我的Java應用程序中定義一個應用程序級別UncaughtExceptionHandler如果在我的應用程序的一個線程中引發未捕獲的異常, 我知道這是可能的定義爲一組線程(ThreadGroup)的未捕獲的異常,我真正使用它,但我想定義線程全球捕獲的異常沒有定義自己未捕獲的異常處理程序或它們與一組具有定義爲的默認異常處理程序的線程無關。爲我的應用程序的所有線程定義一個全局UncaughtExceptionHandler

因此,例如,我想達到這樣的事情:

1° LEVEL ---> Call thread own UncaughtExceptionHandler ---> 2° LEVEL Call Thread Group UncaughtExceptionHandler ---> 3° LEVEL Call application(default) UncaughtExceptionHandler 

簡單來說,我想重寫默認的UncaughtExceptionHandler和定義自己的處理程序,而不是打印堆棧跟蹤的System.err(這是默認行爲)。

例如,在C#.NET我做同樣的處理未處理線程異常事件處理程序在應用程序的Main()方法的東西:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 

甚至可以用Java來完成?

如何我可以覆蓋默認的UncaughtExceptionHandler在Java中?

回答

16

Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler ex)

這應該做到你在找什麼。

正如醫生說

設置當一個線程突然終止,由於未捕獲到異常,並沒有其他的處理程序已爲該線程定義的默認處理程序調用。

使用handler的線程組

注:關於你

而一個有趣的注意(也在文檔),默認未捕獲異常處理程序通常不應 推遲到線程的ThreadGroup對象,因爲這可能會導致遞歸無限的 遞歸。

+0

這是有效的應用程序的所有線程或者這僅適用於在它被定義當前線程?應該在應用程序的主要方法中定義? – aleroot

+1

它被設置爲Thread類中的靜態字段,而不是線程本地字段。所以它對於應用程序中的所有線程都是有效的。它可以在main方法中定義,但您可能想要在主類的'static'塊中定義它。 –

+0

@JohnVint你可以請用上面的評論更新答案。對於我來說,當你說它是Thread類中的靜態字段時很容易理解 – Gerrard

4

您需要設置默認的未捕獲異常處理程序。這是一個名爲setDefaultUncaughtExceptionHandler的Thread類的靜態方法。這樣做會爲正在運行的應用程序設置異常處理程序。除非另有說明,否則它將成爲任何新線程的默認值。

相關問題