目前,特定情况下,defmulti的异常信息并不如可能的那样有帮助。用lazy seq作为派发参数调用此多方法将引发以下异常
`
(defmulti test-multi identity)
(defmethod test-multi 1 [arg] true)
(test-multi (map identity [:x]))
;=> java.lang.IllegalArgumentException: No method in multimethod 'test-multi' for dispatch value: clojure.lang.LazySeq@3c6f1187
`
有时查看正在派发 proces的lazy seq中的值将很有用。更好的错误信息可能看起来像这样
例如这个
(test-multi (map identity [:x])) ;=> java.lang.IllegalArgumentException: No method in multimethod 'test-multi' for dispatch value (:x) of class clojure.lang.LazySeq
此补丁通过使用pr-str
格式化派发值并在传递给异常构造函数之前打印类来解决此问题。对MultiFn.java中抛出派发值作为异常消息一部分的方法也执行了相同的操作。