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

欢迎!请参阅 关于页面 了解更多关于如何使用本站的信息。

+1 点赞
错误
编辑

(.a "") ,如实地,在没有 :phase 的情况下引发 IllegalArgumentException。

然而,我们可以认为这种 IllegalArgumentException 是“编译器似的”,而它似乎看不出与其他在更“运行时情况”下可能抛出的 IllegalArgumentException 区别的明显差异。

我的问题是,作为一个工具制造者,没有这样的区分,所有 IllegalArgumentExceptions 都将受到相同的待遇,而用户可能希望对于那些类似编译器的异常有更简洁的处理(例如,不显示堆栈跟踪)。

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

2 个答案

0 点赞

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

通常运行时异常不会被包装,因为我们想流动抛出的内容。从Clojure运行时抛出一种一致的异常并携带额外的信息可能是有用的,但我不清楚在这一点上是否可行进行改变。

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

当我们知道在编译时对象的类型时会如何?在 `(.a "")` 中,我觉得这“像编译器”。因为我们一开始就知道 `java.lang.String` 上的成员,而 `.a.` 不是其中之一。当是 `(.a someObj)` 时,回退到反射调用是合理的,但在已知类型的情况下,回退到反射调用有什么收获呢?
0 点赞

重置

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

不要使用 `(.a "")`,而使用 Class/member 语法。在这个例子中,使用 `(String/.a "")`。这将会编译(表示Clojure编译器找到了与提供的输入匹配的单个方法),或者将抛出语法异常(表示找到了0个匹配的方法或多个匹配的方法)。

仅使用此语法,您可以确保始终匹配特定的方法,而无需反射。

...