【问题标题】:How to get Clojure exception notification when they happen on the EDT?如何在 EDT 上发生 Clojure 异常通知?
【发布时间】:2013-03-27 02:44:32
【问题描述】:

由于找不到一个错误,我已经抓狂了很长时间。结果证明这是一个例外,但显然因为它发生在 EDT 我无法“看到”它。从终端运行时它没有显示在“lein run”终端中,从 Emacs 运行时它没有显示在任何 Emacs 缓冲区中。

很长一段时间后,我最终这样做了:

(try (function-call-with-arity-error ...) (catch Exception e (println e)

最后,多亏了这个,我才能看到这个打印出来:

#<ArityException clojure.lang.ArityException: wrong number of args passed to...

因此我能够找到我的错误。

如果我这样做:

(do 
   (println "trying...")
   (arity-error-here-on-purpose) ; this ones throws the arity error
   (println "done")
)

然后终端打印 "trying..." 但永远不会到达 "done..."

我尝试设置一个默认的未捕获异常处理程序:异常没有被捕获。就好像程序或 EDT 在 arity 异常之后“卡住”了(没有在任何地方打印任何内容)。

下次我应该如何处理这个问题?因为我在任何地方都看不到任何消息,所以我花了很长时间才找到。再说一遍:'lein run' 终端中没有任何内容,任何 Emacs 缓冲区中也没有任何内容。

我是否应该创建一个函数来包装应该在 EDT 上手动发生的 try / catch 调用,然后记录/打印异常?

另请注意,这是在一个相对“长”的 Clojure 应用程序中:1000 行代码,所以我无法将其粘贴到此处,也无法在一个简短的示例中重现该行为(但它在我的应用程序中始终如一地发生)。

【问题讨论】:

标签: swing exception clojure


【解决方案1】:

您可以使用 Thread 注册未捕获的异常处理程序,这样您就不必包装 EDT 上可能发生的所有调用。

尝试在 EDT 上注册一个,看看这是否会给你想要的行为。

【讨论】:

  • 感谢您帮助我。我只是尝试过,但它不起作用:就好像 EDT 在 arity 异常之后被锁定,而未捕获的异常处理程序没有捕获异常(我确实尝试了来自其他线程的其他异常,并且处理程序正在捕获他们很好)。
猜你喜欢
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 2013-05-03
  • 2020-03-24
相关资源
最近更新 更多