【问题标题】:How to read clojure exceptions in REPL?如何在 REPL 中读取 clojure 异常?
【发布时间】:2013-02-03 22:54:37
【问题描述】:

很多时候,当我尝试编写一些函数时,我得到了异常。这是正常的。在 Java 中,您可以找到发生异常的位置和原因,但在 clojure 中,异常文本只会让我抓狂。是否有一些提示如何读取 clojure 中的异常以及如何查找代码异常发生的位置以及原因?

例如我会拿一些代码:

(do
 (list?)
 (list? [])
 (list? '(1 2 3))
 (list? (defn f [] (do ())))
 (list? "a"))

当我在 REPL 中调用这个函数时,我会得到 ​​p>

java.lang.IllegalArgumentException: Wrong number of args (0) passed to: core$list-QMARK- (NO_SOURCE_FILE:46)

这对我在第二行找到问题没有多大帮助。在稍微复杂一点的代码中,它几乎不会提供任何信息。 (当然它告诉你看看列表?在某些情况下,参数的数量是错误的。)我尝试在 REPL 中编写代码是错误的吗?如何在 REPL 中读取异常消息?有没有办法更好地了解 REPL 中的异常信息?

【问题讨论】:

标签: clojure


【解决方案1】:

你可以使用clojure.stacktracehttp://richhickey.github.com/clojure/clojure.stacktrace-api.html

用法:

(use 'clojure.stacktrace)
(/ 1 0)
(e)

输出:

java.lang.ArithmeticException: Divide by zero
 at clojure.lang.Numbers.divide (Numbers.java:156)
    clojure.lang.Numbers.divide (Numbers.java:3691)
    user$eval954.invoke (NO_SOURCE_FILE:1)
    clojure.lang.Compiler.eval (Compiler.java:6511)
    clojure.lang.Compiler.eval (Compiler.java:6477)
    clojure.core$eval.invoke (core.clj:2797)
    clojure.main$repl$read_eval_print__6405.invoke (main.clj:245)
    clojure.main$repl$fn__6410.invoke (main.clj:266)
nil

【讨论】:

    【解决方案2】:

    获取org.clojure/tools.trace

    user=> (use 'clojure.tools.trace)
    

    让我们试试dotrace(改变了顺序,让事情变得更有趣):

    user=> (dotrace [list?]
      #_=> (do
      #_=>  (list? [])
      #_=>  (list? '(1 2 3))
      #_=>  (list?)
      #_=>  (list? (defn f [] (do ())))
      #_=>  (list? "a"))
      #_=> )
    IllegalStateException Can't dynamically bind non-dynamic var: clojure.core/list?
      clojure.lang.Var.pushThreadBindings (Var.java:353)
    

    嗯……

    user=> (.setDynamic #'list?)
    #'clojure.core/list? 
    

    让我们再试一次:

    user=> (dotrace [list?]
      #_=>   (do
      #_=>   (list? [])
      #_=>   (list? '(1 2 3))
      #_=>   (list?)
      #_=>   (list? (defn f [] (do ())))
      #_=>   (list? "a")))
    TRACE t1216: (list? [])
    TRACE t1216: => false
    TRACE t1217: (list? (1 2 3))
    TRACE t1217: => true
    TRACE t1218: (list?)
    ArityException Wrong number of args (0) passed to: core$list-QMARK-  
      clojure.lang.AFn.throwArity (AFn.java:437)
    

    啊哈!在异常之前到达(list?)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-30
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多