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

欢迎!请访问关于页面以了解此工作的更多信息。

0
编译器

在Clojure 1.9中,如果您抛出一个不是Throwable实例的对象,您将得到以下错误消息

`
user=> (try "something" (catch Object o "oops"))

VerifyError(类:user$eval1432,方法:invokeStatic,签名:()Ljava/lang/Object;)catch_type不是Throwable的子类java.lang.Class.getDeclaredConstructors0(Class.java:-2)
`

错误消息还算不错:它告诉您大部分您想了解的内容(除了您尝试捕获的实际类)。

但在不久的将来,Clojure可能会升级到Java 1.8字节码,到时候错误将看起来像这样

`
user=> (try "something" (catch Object o "oops"))

VerifyError:异常处理程序6中的捕获类型不是Throwable的子类
异常详细信息
位置

user$eval1444.invokeStatic()Ljava/lang/Object; @6: astore_1

原因

Type 'java/lang/Object' (constant pool 17) is not assignable to 'java/lang/Throwable'

字节码

0000000: 120d 4ba7 000a 4c12 0f4b a700 032a b0

异常处理程序表

bci [0, 3] => handler: 6

堆栈映射表

same_locals_1_stack_item_frame(@6,Object[#17])
append_frame(@13,Object[#21])

java.lang.Class.getDeclaredConstructors0(Class.java:-2)
`

在我看来,这似乎是一个内部编译器错误,我认为不应该将其暴露给用户。

补丁通过在try表达式解析时添加一个检查来修复问题,即检查您要捕获的东西是否是Throwable的子类。

2个答案

0

评论由:alexmiller发表

编译器永远不会产生具有VerifyError的字节码,因此这绝对是一个错误。

0
参考:https://clojure.atlassian.net/browse/CLJ-2345(由schmee报告)
...