如果抛出一个包含不可打印的 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 "<unprintable ex-data: " (ex-message t)">)"
可能是一个合理的折衷方案,从而使调试更加容易。