如何访问:原因,:via和:Clojure中异常的跟踪键?

Ert*_*tin 18 lisp error-handling functional-programming clojure clojurescript

我找不到访问:cause, :via and :trace异常密钥的方法.

这是代码:

(try
  (throw (IllegalArgumentException. "1"))
  (catch Exception e
    e))
Run Code Online (Sandbox Code Playgroud)

输出:

#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]
               ....]}
Run Code Online (Sandbox Code Playgroud)

PS :(:通过e)不起作用.

Ale*_*ler 23

发生异常时,Clojure(JVM)将抛出Java Exception对象.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] 
         ...]}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在返回的数据上使用普通的关键字访问器:

user=> (println (:cause *1) (first (:via *1)))
BOOM! {:type java.lang.Exception, :message BOOM!, :at [user$eval7 invokeStatic NO_SOURCE_FILE 4]}
Run Code Online (Sandbox Code Playgroud)