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