欢迎!请参阅关于页面了解更多信息。
(.a "") 会因为没有:phase而抛出IllegalArgumentException。
(.a "")
然而,人们可能会认为这种IllegalArgumentException类似于编译器,而与其他在更“运行时-like”的情况下可能抛出的IllegalArgumentException不容易区分。
我的问题是,作为一个工具制造商,如果没有这种区分,所有IllegalArgumentExceptions都将得到同样的处理,而用户可能希望对编译器-like的异常进行更简洁的处理(例如,不显示堆栈跟踪)。
:cause
:phase
:ex-data
我不会认为这是“一开始就无效的代码”或类似编译器的代码。这是一段语法上有效的代码。当成员不被识别时,它会回退到反射调用,这可能在运行时失败。因此,您可以将其视为“Clojure运行时异常”或类似的东西,但我们并没有在该情况下发生任何一致的行为,并且可能存在数百个类似的情况。
通常我们不捕获运行时异常,因为我们想让抛出的异常继续流动。在Clojure运行时抛出一个带有额外信息的统一异常可能是有用的,但我不知道在这一点上是否可行改变这一点。
这是在Clojure 1.12.0-alpha6中提供的新统一限定方法语法中实现的。
不要使用`(.a "")`,而应使用类/成员语法。在这种情况下,`String/.a ""`。这将编译(表示Clojure编译器找到一个匹配提供的输入的单个方法),或者抛出一个语法异常(表示找到了0个或多个匹配的方法)。
通过仅使用这种语法,您可以确信您始终在匹配特定的方法,而不进行反射。