2013-06-26 16 views
10

Używam Clojure i chcę dostać w swoje ręce ślad stosu, który mogę zalogować (najlepiej, chciałbym uzyskać go jako ciąg).Pobierz stacktrace jako ciąg

Widzę, że (.getStackTrace e) zwraca , ale nie wiem, jak wydrukować coś znaczącego z tego. Moje drugie podejście to (.printStackTrace e) z parametrem PrintWriter jako parametrem (ponieważ wiem, że jest to możliwe w Javie), ale wydaje mi się, że nie mam poprawnej składni.

Dzięki.

Odpowiedz

16

jeśli rozwiązanie number23_cn jest trochę za dużo, to w jaki sposób można wykorzystać wynik .getStackTrace jako ciąg znaków (które następnie mogą być drukowane , umieść w dzienniku, cokolwiek)

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

użycie clojure.repl.pst dostać StackTrace, a wiązanie *err* do 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

działa jak czar. Wystarczy, że zmienię pierwsze zdanie na (użyj [clojure.repl: only (pst)]) – sebi

5

Oto niewielka poprawa w stosunku do odpowiedzi noisemith. Nie pozostawia leniwe nast i posiada funkcję upiększanie:

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

Istnieje również clojure.stacktrace który ma print-stack-trace, print-trace-element i kilka innych przydatnych funkcji.

0

można użyć with-out-str

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