如何在 Clojure 中访问异常的 :cause、:via 和 :trace 键?
How to access :cause, :via and :trace keys of an exception in Clojure?
我找不到访问 :cause, :via and :trace
异常键的方法。
代码如下:
(try
(throw (IllegalArgumentException. "1"))
(catch Exception e
e))
输出:
#error{:cause "1",
:via [{:type java.lang.IllegalArgumentException, :message "1", :at [user$eval4073 invokeStatic "form-init5592296091748814678.clj" 1]}],
:trace [[user$eval4073 invokeStatic "form-init5592296091748814678.clj" 1]
[user$eval4073 invoke "form-init5592296091748814678.clj" 1]
[clojure.lang.Compiler eval "Compiler.java" 6927]
[clojure.lang.Compiler eval "Compiler.java" 6890]
[clojure.core$eval invokeStatic "core.clj" 3105]
[clojure.core$eval invoke "core.clj" 3101]
[clojure.main$repl$read_eval_print__7408$fn__7411 invoke "main.clj" 240]
....]}
P.S: (:via e) 不起作用。
Clojure(JVM)在发生异常时会抛出一个Java异常对象。 Clojure 使用函数 Throwable->map
将其转换为数据,然后为您打印。您可以自己调用该函数:
user=> (try (throw (Exception. "BOOM!"))
(catch Exception e
(Throwable->map e)))
{:cause "BOOM!",
:via [{:type java.lang.Exception,
:message "BOOM!",
:at [user$eval1 invokeStatic "NO_SOURCE_FILE" 1]}],
:trace [[user$eval1 invokeStatic "NO_SOURCE_FILE" 1]
...]}
然后您可以对返回的数据使用普通关键字访问器:
user=> (println (:cause *1) (first (:via *1)))
BOOM! {:type java.lang.Exception, :message BOOM!, :at [user$eval7 invokeStatic NO_SOURCE_FILE 4]}
我找不到访问 :cause, :via and :trace
异常键的方法。
代码如下:
(try
(throw (IllegalArgumentException. "1"))
(catch Exception e
e))
输出:
#error{:cause "1",
:via [{:type java.lang.IllegalArgumentException, :message "1", :at [user$eval4073 invokeStatic "form-init5592296091748814678.clj" 1]}],
:trace [[user$eval4073 invokeStatic "form-init5592296091748814678.clj" 1]
[user$eval4073 invoke "form-init5592296091748814678.clj" 1]
[clojure.lang.Compiler eval "Compiler.java" 6927]
[clojure.lang.Compiler eval "Compiler.java" 6890]
[clojure.core$eval invokeStatic "core.clj" 3105]
[clojure.core$eval invoke "core.clj" 3101]
[clojure.main$repl$read_eval_print__7408$fn__7411 invoke "main.clj" 240]
....]}
P.S: (:via e) 不起作用。
Clojure(JVM)在发生异常时会抛出一个Java异常对象。 Clojure 使用函数 Throwable->map
将其转换为数据,然后为您打印。您可以自己调用该函数:
user=> (try (throw (Exception. "BOOM!"))
(catch Exception e
(Throwable->map e)))
{:cause "BOOM!",
:via [{:type java.lang.Exception,
:message "BOOM!",
:at [user$eval1 invokeStatic "NO_SOURCE_FILE" 1]}],
:trace [[user$eval1 invokeStatic "NO_SOURCE_FILE" 1]
...]}
然后您可以对返回的数据使用普通关键字访问器:
user=> (println (:cause *1) (first (:via *1)))
BOOM! {:type java.lang.Exception, :message BOOM!, :at [user$eval7 invokeStatic NO_SOURCE_FILE 4]}