我正在尝试实现一个“完整的”未捕获异常处理程序,允许还在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会自动修复/重新启动)。
答案 0 :(得分:1)
使用reify
来实施Thread$UncaughtExceptionHandler
。 Java的内部类和接口被命名为类文件。
(def h (reify Thread$UncaughtExceptionHandler
(uncaughtException [this t e]
(println t ": " e))))