繁体   English   中英

为什么printStackTrace不能在Clojure中运行?

[英]Why doesn't printStackTrace work in Clojure?

在欢乐Clojure和Alex Miller的Pure Danger Tech博客文章中 ,建议您使用以下内容打印最后一个堆栈:

(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

我用

(.printStackTrace *e *out*)

这似乎有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM