欢迎!请参阅 关于页面 了解更多关于如何使用本站的信息。
(.a "") ,如实地,在没有 :phase 的情况下引发 IllegalArgumentException。
(.a "")
然而,我们可以认为这种 IllegalArgumentException 是“编译器似的”,而它似乎看不出与其他在更“运行时情况”下可能抛出的 IllegalArgumentException 区别的明显差异。
我的问题是,作为一个工具制造者,没有这样的区分,所有 IllegalArgumentExceptions 都将受到相同的待遇,而用户可能希望对于那些类似编译器的异常有更简洁的处理(例如,不显示堆栈跟踪)。
:cause
:phase
:ex-data
我不会认为这是“一开始就是无效的代码”或者编译器类似的。这是语法上有效的代码。当成员不被识别时,它将回退到反射调用,这可能会在运行时失败。所以,你可以将其视为“Clojure运行时异常”或类似的东西,但我们没有在该情况下发生任何一致的事情,而且可能有一百多个类似的地方。
通常运行时异常不会被包装,因为我们想流动抛出的内容。从Clojure运行时抛出一种一致的异常并携带额外的信息可能是有用的,但我不清楚在这一点上是否可行进行改变。
这是在Clojure 1.12.0-alpha6的新统一限定方法语法中提供的。
不要使用 `(.a "")`,而使用 Class/member 语法。在这个例子中,使用 `(String/.a "")`。这将会编译(表示Clojure编译器找到了与提供的输入匹配的单个方法),或者将抛出语法异常(表示找到了0个匹配的方法或多个匹配的方法)。
(String/.a "")
仅使用此语法,您可以确保始终匹配特定的方法,而无需反射。