请分享您的观点,参加2024年Clojure调查!

欢迎!请访问关于页面了解更多有关如何使用的详细信息。

+1
错误
编辑

(.a "")正确地,在没有:phase的情况下抛出IllegalArgumentException。

然而,可以考虑到,这种IllegalArgumentException是“编译器式的”,它似乎与其他可能在更“运行时式”情况下抛出的IllegalArgumentException没有太大区别。

我的问题在于,作为一个工具制作者,如果没有这样的区别,所有IllegalArgumentException都将受到同样的处理,而用户会更希望对编译器式的给出更简洁的处理(例如,不显示堆栈跟踪)。

  • 有没有推荐的方法来检查运行时异常,以确定它们是否表示从用户角度来看,“从一开始就是无效的代码”?
    • 这个词是一个非正式的术语,用于描述类似于编译器的运行时异常
  • 是否考虑过通过在Clojure编译器/运行时可以可靠地做到这一点时附加一个:cause(或:phase:ex-data等)来使这个过程更容易?

2 个回答

0
by

我不会认为这是“一开始就是无效的代码”或编译器类型的。这是语法上有效的代码。当成员不被识别时,它将回退到反射调用,这可能在运行时失败。所以,你可以将其视为“Clojure运行时异常”或类似之物,但我们没有在这种情况下一致发生的事情,而且可能还有数百个类似的情况。

通常不会捕获运行时异常,因为我们想要流动抛出的内容。在Clojure运行时内部抛出的某种一致性异常并携带额外信息可能是有用的,但我不确定是否能够在这一点上改变它。

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

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

这已经在Clojure 1.12.0-alpha6的新统一限定方法语法中提供。

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

仅使用此语法,您可以确保您总是匹配特定的方法,无需进行反射。

...