如果抛出一个包含不可打印 ex-data
的异常,调用 print-stack-trace
将会失败,因为 print-throwable
将抛出一个异常,这使得调试某些故障变得非常困难。
(defn print-throwable
"Prints the class and message of a Throwable. Prints the ex-data map
if present."
{:added "1.1"}
[^Throwable tr]
(printf "%s: %s" (.getName (class tr)) (.getMessage tr))
(when-let [info (ex-data tr)]
(newline)
(pr info)))
不可打印的 ex-data
可能包括实现多个接口并冲突 print-method
的第三方记录类型,但当没有预期使记录可打印。
将 (pr info)
包装在 (try
.. (catch Throwable t
并打印类似 (str "<不可打印的 ex-data: " (ex-message t)">")
可能是一种合理的折衷方案,以允许更容易的调试。