描述用户面对的问题
当一个异常抛出并且堆栈跟踪中有一个多态方法时,多态方法的名称在调用栈中没有显示。
当我执行以下代码时
(defmulti dispatcher (fn [item] (:type item)))
(defmethod dispatcher "cat"
[{:keys [lives]}]
(/ lives 0))
(dispatcher {:type "cat" :lives 9})
*e
我得到以下堆栈跟踪
[clojure.lang.Numbers divide "Numbers.java" 163]
[clojure.lang.Numbers divide "Numbers.java" 3813]
[config_compilation.core$eval20467$fn__20469 invoke "/Users/marc/dev/circleci/orb-registry/server/src/config_compilation/core.clj" 198]
[clojure.lang.MultiFn invoke "MultiFn.java" 229]
…… 省略……
函数名为 {{config_compilation.core$eval20467$fn__20469}}。
如果我用 {{defn}} 声明 {{dispatcher}},我将得到以下堆栈跟踪
(defn dispatcher
[{:keys [lives]}]
(/ lives 0))
(dispatcher {:type "cat" :lives 9})
*e
[clojure.lang.Numbers divide "Numbers.java" 163]
[clojure.lang.Numbers divide "Numbers.java" 3813]
[config_compilation.core$dispatcher invokeStatic "/Users/marc/dev/circleci/orb-registry/server/src/config_compilation/core.clj" 202]
[config_compilation.core$dispatcher invoke "/Users/marc/dev/circleci/orb-registry/server/src/config_compilation/core.clj" 200]
…… 省略……
函数名正确给出为 {{config_compilation.core$dispatcher}}。
我猜测问题可能是 {{defmulti}} 宏没有设置 {{:name}} 元数据,或者可能没有正确地将 {{:name}} 元数据传递给编译器。