2012-08-17 119 views
2

我想這裏描述構建一個通用的異常處理程序的Swing應用程序:http://www.javaspecialists.eu/archive/Issue081.html擺動的UncaughtExceptionHandler

我的工作中的Jython(Python語法入門編譯成Java和執行)。我的代碼看起來大致是這樣的(更新):

def launcher(func): 
    class launcherThread(Runnable): 
     def __init__(self): 
      super(launcherThread, self).__init__() 

     def run(self): 
      func() 

    #trying to get the name which can be used to instantiate this in java 
    cls = ExceptionGroup().getClass() 
    fullName = cls.__module__ + '.' + cls.__name__ 

    System.setProperty("sun.awt.exception.handler", fullName) 
    Thread(ExceptionGroup(), launcherThread(), 'Cross ExceptionHandlerThread').start() 

class ExceptionGroup(ThreadGroup): 
    def __init__(self): 
     super(ExceptionGroup, self).__init__("HardenedGroup") 

    def uncaughtException(self, thread, exception): 
     #make a fancy dialog displaying str(exception) 

如果我測試它,它工作正常但是在生產enviornment它failes。 爲了進行測試,我在Eclipse(PyDev)中啓動了我的程序,生產環境是一個用Java編寫的第三方應用程序,它有一個Jython控制檯。應用程序支持添加自定義菜單條目,並將jython腳本放在這些條目上。

我在測試和生產環境之間看到的主要區別是在生產環境中,擺動線程已經準備就緒(第三方應用程序利用擺動)。這是否會導致我的ThreadGroup設置失敗,或者有其他原因導致此問題無法解決?

如何獲取相關線程(作爲buttonAction的結果拋出異常)來檢查它們的defaultException處理程序?如果(正如我擔心的那樣)應該證明第三方安裝了自己的處理程序(所有異常都寫入了日誌文件),我該如何創建一個新的swing工作線程? (我不希望趕上畢竟由主機應用程序創建的例外)

問題回顧: 1.我如何檢查哪些線程開始爲傳遞到launcher函數的函數func看到thier未捕獲的異常處理程序? 2.我可以爲我的gui部分和主要應用程序gui部分強制執行一個單獨的swing調度程序嗎? (如果我在我的加入框中退出OnClos,第三方應用程序關閉)?

更新: 考慮anwser從lbalazscs我試圖使用sun.awt.exception.handler屬性,但它沒有任何效果,例外還是在日誌文件(應用程序dfeault行爲)結束。我是否正確使用它? (PS:我在Java 1.6的)

回答

4

如果你有Java 5或更高,你也可以使用Thread.setDefaultUncaughtExceptionHandler(),這也是在一個較新的 「Java專家時事通訊」 中描述:

http://www.javaspecialists.eu/archive/Issue089.html

這裏是最新的Java版本7:

http://www.javaspecialists.eu/archive/Issue196.html

也看到這一點: Why bother with setting the "sun.awt.exception.handler" property?

編輯:這是我如何使用Thread.setDefaultUncaughtExceptionHandler(在Java中...):

public static void setupGlobalExceptionHandling() { 
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
     @Override 
     public void uncaughtException(Thread t, Throwable e) { 
      handleException(e); 
     } 
    }); 
} 
+0

由於我使用的Java 6我假設你在正確的方向我。然而,我現在有另一個問題,我不能讓「sun.awt.exception.handler」porperty工作。我更新了代碼,但它沒有效果(請參閱更新後的問題)。因爲我試圖從不同線程(包括edt)捕獲未處理的異常,所以'setDefaultUncaughtExceptionHandler()'似乎不適合我。 – ted 2012-08-20 08:40:08

+1

使用Thread.setDefaultUncaughtExceptionHandler,您可以爲所有線程設置未捕獲的異常處理(是一種靜態方法)。看到我更新的答案。 – lbalazscs 2012-08-20 09:45:56

+0

非常感謝,這仍然留下屬性問題(我需要設置它我猜),但我不認爲它會導致任何影響(異常仍然通過我的異常處理程序並運行默認方式),... – ted 2012-08-20 10:04:13