Mic*_*ent 11 java exception-handling clojure
有没有办法让Java Exceptions更具信息性?
例如,从ClassCastException docs中获取此代码:
Object x = new Integer(0);
System.out.println((String)x);
Run Code Online (Sandbox Code Playgroud)
Java会给我一个ClassCastException,其中包含"无法将Integer类型转换为String"的消息.我怎么能说:"不能将整数0转换为字符串"而是?如果我试图将一个字符串"foo"强制转换为Person,那么就说:"不能将String foo强制转换为Person"?因此,我试图投射的对象的价值.
我能以某种方式用更有用的信息替换标准的ClassCastException,所以我不必介绍很多try/catch-blocks吗?子类化当然是一个选项,但是我必须引入大量的try/catch-blocks.
我问的原因实际上是因为另一种编译语言编译成JVM,Clojure.
在Clojure中,初学者经常犯这样的错误:
(def my-list ("foo" "bar"))
Run Code Online (Sandbox Code Playgroud)
这会导致错误消息:
java.lang.String cannot be cast to clojure.lang.IFn
Run Code Online (Sandbox Code Playgroud)
对于初学者来说,看到以下内容会非常有帮助:
java.lang.String "foo" cannot be cast to clojure.lang.IFn
Run Code Online (Sandbox Code Playgroud)
所以他们会得到他们试图在这里使用字符串aa函数的线索.
能够为学习环境注入这些新的Exceptions,而不是实际重写Clojure编译器,这将是很好的.它可以通过捕获这些类型的异常来解决REPL级别.我仍然很好奇这是否有可能采用一些漂亮的技术.
这个问题在最新的Clojure Conj中讨论过,并且通常被认为是编译器中可以解决的问题.事实上,为了改善堆栈痕迹,你可以做很多事情,但请放心,你并不是唯一一个寻求改善这一点的人.
编译器很有可能使解析树可用于构建工具,以使人们能够创建能够解释堆栈跟踪并打印更有意义的消息的工具,尽管这些事情需要时间.