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的子类。