一些 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
总是包含文件路径(尽可能的话)会更好,因为只从文件名中可能难以确定异常发生的确切位置。