Получить stacktrace как строку

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

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

Спасибо.

Ответ 1

Если решение number23_cn немного, вы можете использовать результат .getStackTrace как строку (которая затем может быть напечатана, помещена в журнал, что угодно)

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

Ответ 2

использовать 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))))

Ответ 3

Здесь небольшое улучшение по сравнению с шумовым ответом. Он не оставляет ленивого seq и имеет функцию украшения:

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

Ответ 4

Существует также clojure.stacktrace, который имеет print-stack-trace, print-trace-element и некоторые другие полезные функции.

Ответ 5

вы можете использовать with-out-str

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