gpt4 book ai didi

clojure - 如何从 Clojure 异常中提取元数据?

转载 作者:行者123 更新时间:2023-12-05 08:37:57 26 4
gpt4 key购买 nike

我刚刚开始学习 Clojure 并努力提取异常元数据。当我运行这个时:

(try  
  (/ 1 0)
  (catch Exception error (println error)))

如预期的那样,我得到一个 ArithmeticException。打印的堆栈跟踪如下所示:

#error {
:cause Divide by zero
:via
[{:type java.lang.ArithmeticException
:message Divide by zero
:at [clojure.lang.Numbers divide Numbers.java 188]}]
:trace
[[clojure.lang.Numbers divide Numbers.java 188]
[clojure.lang.Numbers divide Numbers.java 3901]
...
]}

对我来说它看起来像一个map,所以我尝试使用(:cause error):cause中提取值,但是它的计算结果为 nil

我该怎么做?


更新:

深入挖掘后,我发现 #error {...} 是一个 java.lang.Throwable类,对吗?

我尝试使用 Java 互操作 (.getCause error) , 但也返回 nil。结果 (.getMessage) error)确实返回“除以零”。

除了 .getMessage() 之外,还有其他方法可以从该类获取特定属性吗?

最佳答案

Clojure 有 ex-message 来从异常中检索消息,还有 ex-cause 来检索原因——如果有的话。 #error 的打印显示在这里有点误导,因为异常中实际上没有“原因”(在 .getCause 的 Java 意义上),因为没有链接异常。

另一个有用的函数是 Throwable->map,它将异常(所有异常的根都是 java.lang.Throwable)转换为常规的 Clojure HashMap 您可以执行所有常规操作:

user=> (ex-message (try (/ 1 0) (catch Exception e e)))
"Divide by zero"
user=> (keys (Throwable->map (try (/ 1 0) (catch Exception e e))))
(:via :trace :cause)
user=> (:cause (Throwable->map (try (/ 1 0) (catch Exception e e))))
"Divide by zero"
user=>

关于clojure - 如何从 Clojure 异常中提取元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64017070/

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