5

मुझे अपवाद के :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] 
       ....]} 

पी.एस: (: ई के माध्यम से) काम नहीं करता है

यहाँ कोड है। एक अपवाद तब होता है जब

+2

यह स्टैकट्रेस/संदेश/कारण के लिए सिर्फ एक सुविधाजनक उत्पादन है। तो आप इसे जावा गेटर्स (https://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html#getStackTrace()) से पुनर्प्राप्त कर सकते हैं: '(seq (.getStackTrace e))' – leetwinski

+2

भी मनोरंजन के लिए आप पढ़ सकते हैं और इस रिकॉर्ड लिख सकते हैं: '(बाध्यकारी [* डेटा-पाठकों * { 'त्रुटि पहचान}] (चलो [अं-डेटा (पठन-स्ट्रिंग (जनसंपर्क-str ई))] (: के माध्यम से अं-डेटा))) ' – leetwinski

+2

या सिर्फ' (: (clojure.edn/पठन-स्ट्रिंग (बाद के चरणों (जनसंपर्क-str ई के माध्यम से) 6))) ' – leetwinski

उत्तर

10

Clojure (JVM) एक जावा अपवाद वस्तु फेंक देते हैं। क्लोजर उस कार्य को 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] 
     ...]} 

फिर आप सिर्फ दिए गए डेटा पर सामान्य कीवर्ड accessors का उपयोग कर सकते हैं:

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

नीचे मेरा उत्तर देख वाह। 'थ्रोबल-> मानचित्र' के बारे में नहीं पता था। – leetwinski

संबंधित मुद्दे