clojure.lang.ExceptionInfo 的两个参数构造器会链接到三个参数版本,传递null作为原因。三个参数的构造器随后调用super并使用null原因,在此之上是注释“null原因等同于没有传递原因”。
这实际上并不正确,因为在这里传递null意味着原因已经被初始化,不管值是什么。因此,您不能在稍后调用ex-info异常的.initCause。在我的情况下,'原因'在抛出时是未知的:异常在上层被捕获,添加原因,然后再次抛出。
总的来说,这个表达式总是会抛出异常:(-> (ex-info "ex" {}) (.initCause (Exception. "cause")))。
简单的解决方案是调用2参数super,并在原因非null时调用.initCause。
谢谢
Matt.