java-为什么printStackTrace在Clojure中不起作用?

在“ 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捕获并使用相关功能

上一篇:Maven概要


下一篇:tensorRT 7.0 学习笔记(三)---使用python api转换onnx模型并序列化