从Clojure代理Thread.UncaughtExceptionHandler

时间:2013-04-06 19:22:16

标签: swing exception clojure event-dispatch-thread

我正在尝试实现一个“完整的”未捕获异常处理程序,允许在Clojure中捕获EDT异常。

我正在尝试从接受的答案(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 个答案:

答案 0 :(得分:1)

使用reify来实施Thread$UncaughtExceptionHandler。 Java的内部类和接口被命名为类文件。

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

请参阅:Implementing Java generic interface in Clojure