一些编译器异常
,尤其是抛出由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
传递构建的。
如果编译器异常
总包含文件路径(尽可能的话)那就很好了,因为仅从文件名可能很难确定异常发生的确切位置。