【问题标题】:Why doesn't printStackTrace work in Clojure?为什么 printStackTrace 在 Clojure 中不起作用?
【发布时间】:2014-05-19 15:58:43
【问题描述】:

在 Clojure 的 Joy of Clojure 和 Alex Miller 的 Pure Danger Tech blog-post 中,建议您可以使用以下内容打印最后一个堆栈:

(use 'clojure.stacktrace) 
(java.util.Date. "foo")
(.printStackTrace *e 5)

但我无法让他们的任何示例起作用,而是得到了

java.lang.NullPointerException: null
        Reflector.java:26 clojure.lang.Reflector.invokeInstanceMethod
         (Unknown Source) jtown$eval9755.invoke

这是怎么回事? .printStackTrace 从外观上看似乎是一个 Java 函数,所以我不确定为什么我首先要将 clojure.stacktrace 带入我的命名空间。不过,我通读了 clojure.stacktrace API,看到了一个 e 函数,它看起来也很相似,但不是 *e 函数,它在核心中,应该绑定到最后一个异常,但不是。有人可以让我了解检查堆栈跟踪的最佳方法吗?

【问题讨论】:

    标签: java api clojure interop stack-trace


    【解决方案1】:

    使用 REPL 时有一些特殊的变量可用,并且

    *e - 保存最后一个异常的结果。

    例如:

    core=> (java.util.Date. "foo")
    IllegalArgumentException   java.util.Date.parse (Date.java:615)
    
    
    core=> (class *e)
    java.lang.IllegalArgumentException
    
    
    core=> (.printStackTrace *e)
    java.lang.IllegalArgumentException
        at java.util.Date.parse(Date.java:615)
            <not included.....>
    

    你是对的,.printStackTrace 是在异常类上调用的 java 方法。这不是很简单(因为它的 java 互操作)所以 clojure.stacktrace 命名空间有一些关于使用堆栈跟踪的实用程序

    所以之后

    (use 'clojure.stacktrace)
    

    您可以使用 stacktrace 库而不是 java interop:

    core=> (print-stack-trace *e)
    java.lang.IllegalArgumentException: null
     at java.util.Date.parse (Date.java:615)
     <not included.....>
    

    显然,在应用程序中,您可以尝试使用 *e 而不是 *e,并根据需要使用相关功能

    【讨论】:

    • 这很棒。我发现我之前遇到的麻烦基本上仅限于 LightTable。听起来像一个错误。谢谢!
    【解决方案2】:

    我用

    (.printStackTrace *e *out*)
    

    这似乎行得通。

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      相关资源
      最近更新 更多