2013-06-26 8 views
10

मैं क्लोजर का उपयोग कर रहा हूं और मैं अपने हाथों को एक स्टैक ट्रेस पर प्राप्त करना चाहता हूं जिसे मैं लॉग कर सकता हूं (आदर्श रूप में, मैं इसे स्ट्रिंग के रूप में प्राप्त करना चाहता हूं)।स्ट्रिंग के रूप में stacktrace प्राप्त करें

मुझे लगता है कि (.getStackTrace e)StackTraceElement[] देता है लेकिन मुझे नहीं पता कि इसमें से कुछ अर्थपूर्ण प्रिंट कैसे करें। मेरा दूसरा दृष्टिकोण (.printStackTrace e) एक पैरामीटर के रूप में प्रिंटवाइटर के साथ था (क्योंकि मुझे पता है कि यह जावा में संभव है), लेकिन मुझे सही वाक्यविन्यास नहीं लगता है।

धन्यवाद।

उत्तर

16

अगर number23_cn के समाधान थोड़ा ज्यादा है, यह कैसे आप (स्ट्रिंग के रूप .getStackTrace का परिणाम का उपयोग कर सकते हैं जो तब मुद्रित किया जा सकता है , लॉग इन करें, जो भी हो)

(try (/ 1 0) 
    (catch Throwable t 
    (map str (.getStackTrace t)))) 
8

उपयोग clojure.repl.pst StackTrace मिलता है, और बाध्यकारी *err*java.io.StringWriter रहे हैं:

(use '[clojure.repl :only (pst)]) 

(defmacro with-err-str 
    "Evaluates exprs in a context in which *err* is bound to a fresh 
    StringWriter. Returns the string created by any nested printing 
    calls." 
    [& body] 
    `(let [s# (new java.io.StringWriter)] 
    (binding [*err* s#] 
     [email protected] 
     (str s#)))) 

(try 
    (/ 1 0) 
    (catch Exception e 
    (let [s (with-err-str (pst e 36))] 
     (println "Error log:") 
     (println s)))) 
+0

वर्क्स एक आकर्षण की तरह उपयोग कर सकते हैं। बस मैं पहले कथन को बदलने के लिए गाद (उपयोग [clojure.repl: केवल (पीएसटी)]) – sebi

5

यहां नोइस्मिथ के जवाब पर मामूली सुधार हुआ है। यह एक आलसी seq छोड़ दें और एक सौंदर्यीकरण सुविधा है नहीं करता है:

(apply str (interpose "\n" (.getStackTrace t))) 
0

वहाँ भी clojure.stacktrace जो print-stack-trace, print-trace-element और कुछ अन्य उपयोगी कार्य करता है है।

0

आप with-out-str

(try 
    (name nil) 
    (catch Exception e 
    (with-out-str (println e)))) 
संबंधित मुद्दे