2013-06-26 4 views
10

Я использую Clojure, и я хочу получить трассировку стека, которую я могу зарегистрировать (в идеале, я хотел бы получить ее как String).Получить stacktrace как строку

Я вижу, что (.getStackTrace e) возвращает StackTraceElement[], но я не знаю, как напечатать что-то значимое из него. Мой второй подход был (.printStackTrace e) с PrintWriter в качестве параметра (потому что я знаю, что это возможно в Java), но я, похоже, не получаю правильный синтаксис.

Спасибо.

ответ

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: only (pst)]) – 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)))) 
Смежные вопросы