在“ Clojure的喜悦”和Alex Miller的Pure Danger Tech blog-post中,建议您使用以下类似的方法打印最后的纸叠:
(use 'clojure.stacktrace)
(java.util.Date. "foo")
(.printStackTrace *e 5)
但是我无法得到他们的任何例子,而只是得到
java.lang.NullPointerException: null
Reflector.java:26 clojure.lang.Reflector.invokeInstanceMethod
(Unknown Source) jtown$eval9755.invoke
这是怎么回事?从外观上看.printStackTrace似乎是一个Java函数,因此我不确定为什么首先要将clojure.stacktrace引入我的命名空间.不过,我通读了clojure.stacktrace API,并看到了一个e函数,它看起来也很相似,但不是* e函数,它位于内核中,应该绑定到最后一个异常,但不是.有人可以帮我弄清楚检查堆栈跟踪的最佳方法吗?
解决方法:
使用REPL和
* e-保存最后一个异常的结果.
例如:
core=> (java.util.Date. "foo")
IllegalArgumentException java.util.Date.parse (Date.java:615)
core=> (class *e)
java.lang.IllegalArgumentException
core=> (.printStackTrace *e)
java.lang.IllegalArgumentException
at java.util.Date.parse(Date.java:615)
<not included.....>
没错,.printStackTrace是在异常类上调用的java方法.这不是很简单(因为它是java互操作),因此clojure.stacktrace命名空间具有一些有关处理堆栈跟踪的实用程序
所以之后
(use 'clojure.stacktrace)
您可以使用stacktrace库而不是java interop:
core=> (print-stack-trace *e)
java.lang.IllegalArgumentException: null
at java.util.Date.parse (Date.java:615)
<not included.....>
显然,在应用程序中,您可以尝试* *,而不是* e捕获并使用相关功能