Clojure+Lein环境下REPL执行函数报错,如何获取完整堆栈跟踪?
如何在Clojure Lein REPL中打印完整异常堆栈跟踪
嘿,这个问题我之前踩过坑!当REPL只抛出简短的ClassCastException信息时,确实很难精准定位到底哪一行代码把Long类型当成函数调用了。别着急,这里有几个实用的方法帮你调出完整堆栈:
利用REPL特殊变量
*e查看最近异常
异常抛出后,直接在REPL里执行以下代码就能打印完整堆栈:;; 先加载stacktrace命名空间(如果没加载过的话) (require '[clojure.stacktrace :as st]) ;; 打印完整堆栈 (st/print-stack-trace *e)这里的
*e是Clojure REPL的内置特殊变量,它会保存最后一次抛出的异常对象,通过print-stack-trace就能展开所有调用层级的细节,包括具体的代码行号。配置REPL默认显示完整堆栈
如果你不想每次都手动执行上述代码,可以修改项目根目录的project.clj,在:repl-options里添加初始化配置,让REPL启动时自动开启完整堆栈打印::repl-options {:init (do (require '[clojure.stacktrace :as st]) ;; 开启自动打印完整堆栈 (set! *print-stack-trace* true))}保存后重启REPL,之后所有抛出的异常都会自动显示完整的堆栈跟踪信息。你也可以直接在当前REPL里临时开启:
(set! *print-stack-trace* true)。用
try-catch包裹可疑代码块
如果你能锁定大概的可疑代码范围,可以把它放在try-catch块里,主动捕获并打印异常堆栈:(try ;; 替换成你怀疑有问题的函数或代码 (your-suspect-function) (catch Exception e (clojure.stacktrace/print-stack-trace e)))
完整的堆栈跟踪会清晰展示每一层函数调用的位置,你很容易就能找到类似(123 some-arg)或者某个被意外赋值为Long的变量被当作函数调用的地方——这正是触发Long cannot be cast to IFn错误的根源。
内容的提问来源于stack exchange,提问作者saga
相关产品推荐
相关产品推荐

