2013-06-26 20 views
10

ich Clojure bin mit und ich möchte, dass meine Hände auf einen Stack-Trace erhalten, die ich anmelden kann (im Idealfall würde Ich mag es als String bekommen).Get Stacktrace als String

Ich sehe, dass (.getStackTrace e) gibt eine StackTraceElement[] zurück, aber ich weiß nicht, wie man etwas Sinnvolles daraus drucken. Mein zweiter Ansatz war (.printStackTrace e) mit einem Printwriter als Parameter (weil ich weiß, dass dies in Java möglich ist), aber ich scheine nicht die richtige Syntax zu erhalten.

Danke.

Antwort

16

wenn number23_cn-Lösung ein wenig zu viel ist, das ist, wie Sie das Ergebnis .getStackTrace als Zeichenfolge verwenden können (die dann gedruckt werden kann , in ein Protokoll, was auch immer)

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

Verwendung clojure.repl.pst Stacktrace erhalten und die Bindung *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

wirkt wie ein Zauber verwenden. Nur dass ich die erste Anweisung ändern soll (benutze [clojure.repl: only (pst)]) – sebi

5

Hier ist eine leichte Verbesserung gegenüber der NoiseMiths Antwort. Es braucht nicht faul seq verlassen und hat eine Verschönerungs Merkmal:

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

Es gibt auch clojure.stacktrace die print-stack-trace, print-trace-element und einige andere hilfreiche Funktionen.

0

können Sie with-out-str

(try 
    (name nil) 
    (catch Exception e 
    (with-out-str (println e))))