gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:13:56 25 4
gpt4 key购买 nike

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 函数,它位于核心并且应该绑定(bind)到最后一个异常,但事实并非如此。有人可以告诉我检查堆栈跟踪的最佳方法吗?

最佳答案

在使用 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 interop)所以 clojure.stacktrace 命名空间有一些关于处理堆栈跟踪的实用程序

所以之后

(use 'clojure.stacktrace)

您可以使用堆栈跟踪库而不是 java 互操作:

core=> (print-stack-trace *e)
java.lang.IllegalArgumentException: null
at java.util.Date.parse (Date.java:615)
<not included.....>

显然,在应用程序中,您可以执行 try - catch 并根据需要使用相关函数,而不是 *e

关于java - 为什么 printStackTrace 在 Clojure 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23742245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com