我一直在抓我的头发很长一段时间,我找不到错误。事实证明这是一个arity例外,但显然是因为它发生在美国东部时间,我无法“看到”它。当从终端运行时它没有显示在“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")
)
然后终端打印“尝试......”但从未进入“完成......”。
我尝试设置默认的未捕获异常处理程序:异常未被捕获。这就好像程序或EDT在arity异常之后“卡住”(没有在任何地方打印任何东西)。
我想如何在下次处理这个问题?因为我在任何地方看不到任何消息,所以我花了很长时间才找到。再一次:'lein run'终端没有任何东西,任何Emacs缓冲区都没有。
我是否应该手动创建一个函数来包装应该在try / catch内的EDT上发生的调用,然后记录/打印异常?
另请注意,这是一个相对“长”的Clojure应用程序:1000行代码,所以我无法将其粘贴到此处,我无法在一个简短的示例中重现该行为(但它在我的应用程序中始终如一地发生)。
答案 0 :(得分:0)
您可以使用线程注册未捕获的异常处理程序,这样您就不必包装EDT上可能发生的所有调用。
尝试使用EDT注册一个,看看这是否能为您提供所需的行为。