2

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

我正在尝试从此处接受的答案(有 15 个以上的赞成票)中实现该类:

如何捕获事件调度线程 (EDT) 异常?

这是我想移植到 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 会自动修复/重新启动)。

4

1 回答 1

1

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

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

请参阅:在 Clojure 中实现 Java 泛型接口

于 2013-04-06T20:41:20.307 回答