请在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](https://clojure.atlassian.net/browse/CLJ-2345)(由schmee报告)
...