请在 2024 Clojure状态调查! 分享你的想法。

欢迎!请参阅关于页面了解更多信息。

+1
错误
编辑

(.a "") 会因为没有:phase而抛出IllegalArgumentException。

然而,人们可能会认为这种IllegalArgumentException类似于编译器,而与其他在更“运行时-like”的情况下可能抛出的IllegalArgumentException不容易区分。

我的问题是,作为一个工具制造商,如果没有这种区分,所有IllegalArgumentExceptions都将得到同样的处理,而用户可能希望对编译器-like的异常进行更简洁的处理(例如,不显示堆栈跟踪)。

  • 是否有推荐的方式检查运行时异常,以确定它们是否代表了用户视角中“一开始就无效的代码”?
    • (这是一个非正式术语,用于描述类似于编译器的运行时异常)
  • 在Clojure编译器/运行时可以可靠地这样做的情况下,是否考虑通过附加:cause(或:phase:ex-data等)来简化这个过程?

2 个答案

0

我不会认为这是“一开始就无效的代码”或类似编译器的代码。这是一段语法上有效的代码。当成员不被识别时,它会回退到反射调用,这可能在运行时失败。因此,您可以将其视为“Clojure运行时异常”或类似的东西,但我们并没有在该情况下发生任何一致的行为,并且可能存在数百个类似的情况。

通常我们不捕获运行时异常,因为我们想让抛出的异常继续流动。在Clojure运行时抛出一个带有额外信息的统一异常可能是有用的,但我不知道在这一点上是否可行改变这一点。

> 当成员不被识别时,它会回退到反射调用,这可能在运行时失败。

当在编译时知道对象类型时怎么办?`(.a "")`对我来说感到“像编译器一样”,因为我们一开始就知道`java.lang.String`上的成员,而`.a`不是其中之一。当是`(.a someObj)`时回退到反射调用是有意义的,但是在已知类型的情况下,通过回退到反射调用有什么好处?
0

再次显示

这是在Clojure 1.12.0-alpha6中提供的新统一限定方法语法中实现的。

不要使用`(.a "")`,而应使用类/成员语法。在这种情况下,`String/.a ""`。这将编译(表示Clojure编译器找到一个匹配提供的输入的单个方法),或者抛出一个语法异常(表示找到了0个或多个匹配的方法)。

通过仅使用这种语法,您可以确信您始终在匹配特定的方法,而不进行反射。

...