Ответ 1
Если решение number23_cn немного, вы можете использовать результат .getStackTrace как строку (которая затем может быть напечатана, помещена в журнал, что угодно)
(try (/ 1 0)
(catch Throwable t
(map str (.getStackTrace t))))
Я использую Clojure, и я хочу получить трассировку стека, которую я могу зарегистрировать (в идеале, я хотел бы получить ее как String).
Я вижу, что (.getStackTrace e)
возвращает StackTraceElement[]
, но я не знаю, как напечатать что-то значимое из него. Мой второй подход был (.printStackTrace e)
с PrintWriter как параметр (потому что я знаю, что это возможно в Java), но я, похоже, не получаю правильный синтаксис.
Спасибо.
Если решение number23_cn немного, вы можете использовать результат .getStackTrace как строку (которая затем может быть напечатана, помещена в журнал, что угодно)
(try (/ 1 0)
(catch Throwable t
(map str (.getStackTrace t))))
использовать 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))))
Здесь небольшое улучшение по сравнению с шумовым ответом. Он не оставляет ленивого seq и имеет функцию украшения:
(apply str (interpose "\n" (.getStackTrace t)))
Существует также clojure.stacktrace, который имеет print-stack-trace
, print-trace-element
и некоторые другие полезные функции.
вы можете использовать with-out-str
(try
(name nil)
(catch Exception e
(with-out-str (println e))))