5

例外のキー:cause, :via and :traceにアクセスする方法が見つかりませんでした。ここでアクセスするには:cause、:via、:Clojureの例外のトレースキー?

は、コードは次のとおりです。

(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:(:E経由)は動作しません。

+2

それはスタックトレース/メッセージ/原因のためだけの便利な出力です。したがって、java getters(https://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html#getStackTrace())で取得できます。 '(seq(.getStackTrace e))' – leetwinski

+2

また、このレコードを読み書きすることもできます: '(binding [* data-readers * {'エラーID}] ([err-data(read-string(pr-str e))] " – leetwinski

+2

または単に'(:via(clojure.edn/read-string)(subs(pr-str e)6)))) ' – leetwinski

答えて

10

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] 
     ...]} 

それからちょうど返されたデータに、通常のキーワードアクセサを使用することができます。

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

wow。 'Throwable-> map'については知らなかった。 – leetwinski

関連する問題