2024 年 Clojure 状态调查中分享您的想法!

欢迎!请参阅关于页面以获取更多关于此如何工作的信息。

+1投票
错误

一些编译器异常,尤其是抛出由def形式初始化表达式引发的异常,只包含文件名,不包含文件路径。

例如,假设您有一个类似下面的文件

(ns example.core1)

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

然后加载命名空间,您将看到编译器异常只包含文件名,而不是文件路径

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中的文件路径的其它编译器异常形成对比。例如,假设您有另一个类似下面的文件

(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传递构建的。

如果编译器异常总包含文件路径(尽可能的话)那就很好了,因为仅从文件名可能很难确定异常发生的确切位置。

1 个答案

0投票

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

...