1

我一直在抓挠我的头发很长一段时间,但我找不到一个错误。结果证明这是一个例外,但显然因为它发生在 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 上手动尝试/捕获的调用,然后记录/打印异常?

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

4

1 回答 1

0

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

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

于 2013-03-26T18:23:38.127 回答