2013-04-06 45 views
2

我試圖實現一個「完整的」未捕獲的異常處理程序,允許在Clojure中捕獲EDT異常。從Clojure Proxying Thread.UncaughtExceptionHandler

我試圖實現從接受的答案(含15個以上upvotes)類從這裏:

How can i catch Event Dispatch Thread (EDT) exceptions?

下面是我想端口部分的Clojure:

public static class ExceptionHandler implements Thread.UncaughtExceptionHandler { 

    public void handle(Throwable thrown) { 
     // for EDT exceptions 
     handleException(Thread.currentThread().getName(), thrown); 
    } 

    public void uncaughtException(Thread thread, Throwable thrown) { 
     // for other uncaught exceptions 
     handleException(thread.getName(), thrown); 
    } 

    protected void handleException(String tname, Throwable thrown) { 
     System.err.println("Exception on " + tname); 
     thrown.printStackTrace(); 
    } 
    } 

    public static void main(String[] args) { 
    Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler()); 
    System.setProperty("sun.awt.exception.handler", 
         ExceptionHandler.class.getName()); 

但是我卡住了。 UncaughtExceptionHandler是Thread內定義的公共接口,我似乎無法從Clojure中進行代理。

我不知道該輸入什麼,也不知道該如何實現。

任何幫助將不勝感激,因爲我有異常,因爲他們在EDT的某個地方「丟失」(並且EDT自動修復/重新啓動),所以我似乎可以診斷出這些異常。

回答

1

使用reify來實現Thread$UncaughtExceptionHandler。來自Java的內部類和接口被命名爲類文件。

(def h (reify Thread$UncaughtExceptionHandler  
    (uncaughtException [this t e] 
    (println t ": " e)))) 

參見:Implementing Java generic interface in Clojure