2009-10-10 142 views
36

是否有辦法在Java中創建全局異常處理程序?我想這樣使用:Java:全局異常處理程序

"When an exception is thrown somewhere in the WHOLE program, exit." 

處理程序可能無法捕獲在try-catch正文中拋出的異常。

Martijn

回答

0

DefaultUncaughtExceptionHandler是正確的答案。它在幾天前被Jeff Storeythis的位置上透露給我。正如你懷疑的那樣,這個處理程序永遠不會捕獲「手動」捕獲的異常。但是我得到以下警告:

** - 要符合J2EE,web應用程序不應該使用任何線程**

當我檢查我的項目對好的做法和建議的Java代碼風格PMDEclipse IDE的插件。

+0

「** - 要符合J2EE,一個Web應用程序不應該使用任何線程。**」 - 我不知道這一點。你的意思是servlet中的service()(和doGet(),doPost()等)方法不應該產生新的線程? – Kolibri 2009-10-10 18:06:26

+0

我不知道這意味着什麼,因爲我的應用程序不是基於Web的。我谷歌了一段時間,我還沒有找到任何答案,我很害怕。除了這樣的警告或「變量名稱太短」或「變量名稱太長」之外,我已經建立了PMD作爲一個很好的靈感來源。我強烈推薦它。 – hypercube 2009-10-10 18:14:57

+1

我做了一些挖掘,顯然你不能直接在J2EE中創建線程。我找到了幾個鏈接:http://www.theserverside.com/discussions/thread.tss?thread_id=44353和http://stackoverflow.com/questions/533783/why-spawning-threads-in-j2ee - 容器是不鼓勵 – Kolibri 2009-10-10 20:05:52

1

爲了說明起見,請將setDefaultUncaughtExceptionHandler用於獨立Java應用程序,或者您確信您具有定義好的線程入口點的實例。

對於線程沒有明確定義的入口點的情況,例如,當您在Web服務器或應用服務器上下文或其他框架中運行安裝程序和拆卸代碼以外的代碼時,看看這個框架是如何處理全局異常的。通常,這些框架擁有自己建立的全局異常處理程序,您將成爲參與者而不是定義。

更詳盡的討論,請參閱http://metatations.com/2011/11/20/global-exception-handling-in-java/

2

這裏是它使用Logback來處理任何未捕獲的異常的例子:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
    public void uncaughtException(Thread t, Throwable e) { 
     LoggerFactory.getLogger("CustomLogger").error("Uncaught Exception in thread '" + t.getName() + "'", e); 
     System.exit(1); 
    } 
}); 

這也可以使用Thread.setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)

每個線程的基礎上進行
0

Threads.setDefaultUncaughtExceptionHandler()可以使用,但不是所有情況。例如,在創建Swing小部件之前,我在main()中使用它,並且它在由Swing創建的線程(例如AWT事件線程或SwingWorker線程)中工作。

不幸的是,它在使用JavaSE 1.6使用LDAP URL時對javax.naming.spi.NamingManager.getInitialContext()創建的線程沒有任何影響。毫無疑問,還有其他例外。