clojure - 如何从 Clojure 异常中提取元数据?
问题描述
我刚刚开始学习 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]
...
]}
对我来说它看起来像 a map
,所以我尝试从:cause
with中提取值(:cause error)
,但它的计算结果为nil
。
我怎样才能做到这一点?
更新:
挖了一下,发现#error {...}
是一个java.lang.Throwable类,对吗?
我尝试使用 Java 互操作(.getCause error)
,但也返回nil
。结果(.getMessage) error)
确实返回“除以零”。
除了 ,还有其他方法可以从该类中获取特定属性.getMessage()
吗?
解决方案
Clojure 必须ex-message
从异常ex-cause
中检索消息并检索原因——如果有的话。的打印显示在#error
这里有点误导,因为异常中实际上没有“原因”(在 Java 意义上.getCause
),因为没有链接异常。
另一个有用的功能是Throwable->map
将异常(所有异常都java.lang.Throwable
在其根)转换为常规 Clojure 哈希映射,您可以在其上执行所有常规操作:
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=>
推荐阅读
- sql - 验证选择正则表达式中的序号和字符
- mongodb - 从离线副本更新在线 Mongo 数据库
- javascript - axios数据中的等号导致axios没有发送正确的数据对象
- python - Python读取CSV在数据中添加反斜杠
- ftp - 如何从 Windows 客户端使用 -s 模式从文件 sftp
- r - 如何有效地使用 tidyverse 来延长我的数据集,以便根据存储在列中的范围每个值有一行?
- c# - 如何在 C# 中创建一个简单的字符串索引数组的字符串索引数组?
- r - 根据两个变量计算唯一观察值的计数和比例
- javascript - 节点 JS。Uncaught (in promise) ReferenceError: require is not defined
- python - 无法防止斐波那契“for”循环迭代中的“列表索引超出范围”错误