首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Clojure中获取callstack

在Clojure中获取callstack
EN

Stack Overflow用户
提问于 2010-11-01 04:55:56
回答 1查看 4.6K关注 0票数 20

当我运行Clojure程序并在执行过程中遇到错误时,我注意到REPL打印的消息只包含我执行的脚本的顶层行号。我能让它转储一个调用堆栈(引用Clojure代码的各种行号)吗?

例如:

代码语言:javascript
复制
user=> (load-file "test.clj")
java.lang.IllegalArgumentException: Wrong number of args (1) passed to: user$eval134$fn (test.clj:206)
user=>

如果我知道的不仅仅是顶级调用(206行),那就更好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-01 05:17:49

抛出的最后一个异常在*e变量中可用。您可以通过对异常调用.printStackTrace来打印堆栈跟踪。如果异常是由文件中的源代码抛出的,它将打印行号;如果异常来自REPL,它将打印行号,就像我在下面的示例中那样。

代码语言:javascript
复制
Clojure 1.2.0
user=> (throw (Exception. "FOO"))
java.lang.Exception: FOO (NO_SOURCE_FILE:0)
user=> *e
#<CompilerException java.lang.Exception: FOO (NO_SOURCE_FILE:0)>
user=> (.printStackTrace *e)
java.lang.Exception: FOO (NO_SOURCE_FILE:0)
        at clojure.lang.Compiler.eval(Compiler.java:5440)
        at clojure.lang.Compiler.eval(Compiler.java:5391)
        at clojure.core$eval.invoke(core.clj:2382)
        at clojure.main$repl$read_eval_print__5624.invoke(main.clj:183)
        at clojure.main$repl$fn__5629.invoke(main.clj:204)
        at clojure.main$repl.doInvoke(main.clj:204)
        at clojure.lang.RestFn.invoke(RestFn.java:422)
        at clojure.main$repl_opt.invoke(main.clj:262)
        at clojure.main$main.doInvoke(main.clj:355)
        at clojure.lang.RestFn.invoke(RestFn.java:398)
        at clojure.lang.Var.invoke(Var.java:361)
        at clojure.lang.AFn.applyToHelper(AFn.java:159)
        at clojure.lang.Var.applyTo(Var.java:482)
        at clojure.main.main(main.java:37)
Caused by: java.lang.Exception: FOO
        at user$eval1.invoke(NO_SOURCE_FILE:1)
        at clojure.lang.Compiler.eval(Compiler.java:5424)
        ... 13 more
nil

在Clojure 1.3 (alpha)中,有一个名为pst的函数可以做同样的事情。这些堆栈跟踪更好一些,因为删除了一些无关的行。

代码语言:javascript
复制
Clojure 1.3.0-master-SNAPSHOT
user=> (throw (Exception. "FOO"))
Exception FOO  user/eval1 (NO_SOURCE_FILE:1)
user=> (pst)
Exception FOO
        user/eval1 (NO_SOURCE_FILE:1)
        clojure.lang.Compiler.eval (Compiler.java:5998)
        clojure.lang.Compiler.eval (Compiler.java:5965)
        clojure.core/eval (core.clj:2652)
        clojure.core/eval (core.clj:-1)
        clojure.main/repl/read-eval-print--5575 (main.clj:178)
        clojure.main/repl/fn--5580 (main.clj:199)
        clojure.main/repl (main.clj:199)
        clojure.main/repl-opt (main.clj:257)
        clojure.main/main (main.clj:350)
        clojure.lang.Var.invoke (Var.java:361)
        clojure.lang.Var.applyTo (Var.java:482)
nil

某些IDE(例如Emacs的SLIME )会自动弹出堆栈跟踪。还有一些用于显示和操作堆栈跟踪的库,如clojure.stacktraceclj-stacktrace

堆栈跟踪处理似乎是Clojure的一个方面,目前仍在改进中。

票数 30
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4065062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档