我想這裏描述構建一個通用的異常處理程序的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的)
由於我使用的Java 6我假設你在正確的方向我。然而,我現在有另一個問題,我不能讓「sun.awt.exception.handler」porperty工作。我更新了代碼,但它沒有效果(請參閱更新後的問題)。因爲我試圖從不同線程(包括edt)捕獲未處理的異常,所以'setDefaultUncaughtExceptionHandler()'似乎不適合我。 – ted 2012-08-20 08:40:08
使用Thread.setDefaultUncaughtExceptionHandler,您可以爲所有線程設置未捕獲的異常處理(是一種靜態方法)。看到我更新的答案。 – lbalazscs 2012-08-20 09:45:56
非常感謝,這仍然留下屬性問題(我需要設置它我猜),但我不認爲它會導致任何影響(異常仍然通過我的異常處理程序並運行默認方式),... – ted 2012-08-20 10:04:13