这个概念已经存在于 Clojure 的多个地方 - Compiler$CompilerException 和 EdnReader 和 LispReader 中埋藏的 Exception 类。它在其他抛出 IllegalArgument 或其他异常的地方也很有用。
例如,这个协议异常会抛出 IllegalArgumentException,并能在错误位置传输文件、行和列信息,但似乎使用现有异常来完成这个目的有些奇怪。
(defprotocol Bar (m [this]) (m [this arg]))