2024 Clojure 状态调查!分享你的想法。

欢迎!请查阅关于页面以了解更多有关此页面如何工作的信息。

+1
错误

一些 CompilerException,尤其是由 def 表达式的 init 表达式抛出的异常,只包含文件名,而不是文件路径。

例如,假设你有一个看起来像这样的文件

(ns example.core1)

(def x (throw (ex-info "error!!" {})))

然后加载命名空间,你会看到一个 CompilerException 只包含文件名,而不包含文件路径

user=> (require 'example.core1)
Execution error (ExceptionInfo) at example.core1/fn (core1.clj:3).
error!!
user=> (ex-data *e)
#:clojure.error{:phase :execution, :line 3, :column 8, :source "core1.clj"}
user=>

这与其他包含文件路径在它们 ex-data 中的 CompilerException 相比。例如,假设你还有一个看起来像这样的文件

(ns example.core2)

(no-such-function)

然后

user=> (require 'example.core2)
Syntax error compiling at (example/core2.clj:3:1).
Unable to resolve symbol: no-such-function in this context
user=> (ex-data *e)
#:clojure.error{:phase :compile-syntax-check, :line 3, :column 1, :source "example/core2.clj"}
user=>

这似乎是由于 DefExpr 使用 SOURCE 而不是 SOURCE_PATH 来构建产生的。

如果 CompilerException 总是包含文件路径(尽可能的话)会更好,因为只从文件名中可能难以确定异常发生的确切位置。

1 条答案

0

一般来说,执行异常可能出现在任何地方(不仅仅是 Clojure 代码),我们更多地依赖于堆栈跟踪来使用 (pst *e) 识别位置。对于像编译/宏扩展检查这样的东西,这些肯定是在 Clojure 代码中,所以它们以不同的方式处理。

...