Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使异常更具信息性_Java_Exception Handling_Clojure - Fatal编程技术网

Java 使异常更具信息性

Java 使异常更具信息性,java,exception-handling,clojure,Java,Exception Handling,Clojure,有没有办法让Java异常更具信息性 例如,从ClassCastException文档中获取以下代码: Object x = new Integer(0); System.out.println((String)x); Java将给我一个ClassCastException,其中包含一条消息,如“不能将Integer类型的内容转换为字符串”。我怎么能让它说:“不能将整数0转换为字符串”呢? 如果我试着把一个字符串“foo”抛给一个人,让它说:“不能把字符串foo抛给一个人”?所以我试着用这个物体

有没有办法让Java异常更具信息性

例如,从ClassCastException文档中获取以下代码:

Object x = new Integer(0);
System.out.println((String)x);
Java将给我一个ClassCastException,其中包含一条消息,如“不能将Integer类型的内容转换为字符串”。我怎么能让它说:“不能将整数0转换为字符串”呢? 如果我试着把一个字符串“foo”抛给一个人,让它说:“不能把字符串foo抛给一个人”?所以我试着用这个物体的价值

我是否可以用信息量更大的类替换标准的ClassCastException,,这样我就不必引入很多try/catch块了?子类化当然是一种选择,但是我必须引入大量的try/catch块。

我问这个问题的原因实际上是因为编译到JVM的另一种编程语言Clojure

在Clojure中,初学者经常犯这样的错误:

(def my-list ("foo" "bar"))
这将导致一条错误消息:

java.lang.String cannot be cast to clojure.lang.IFn
初学者可以看到以下内容,这将非常有帮助:

java.lang.String "foo" cannot be cast to clojure.lang.IFn
所以他们会得到线索,他们试图在这里使用字符串和函数


能够为学习环境注入这些新的异常,而无需重新编写Clojure编译器,这将是一件好事。不过,通过捕获这些类型的异常,可以在REPL级别解决这个问题。不过,我还是很好奇,用一些巧妙的技巧是否可以做到这一点。

抓住它,然后再把它和你的信息一起扔出去

try {

} catch(ClassCastException ex) {
    throw new ClassCastException("Your own message here!");
}

您可以用try/catch来包围代码块:

Object x = new Integer(0);
try {
  System.out.println((String)x);
} catch (ClassCastException e) {
  throw new ClassCastException("Can't cast the Integer " + x + " to a String");
}

你的问题没有真正意义。也许可以举一个更好的例子。唯一一件与您尝试做的事情非常相似的事情是使用面向方面的编程框架(例如AspectJ)拦截异常。您可以将一个异常替换为另一个异常,但可能无法像示例中那样实际访问未能强制转换的对象。

此答案是在编辑问题和提到Clojure之前键入的

创建一个自定义静态方法,用于转换为字符串,如CastUtil.castString()。在该方法中,您可以在尝试强制转换之前检查类型,并引发包含该值的信息性异常

为了更方便地使用此新方法,您还可以像这样使用import static:

import static myutil.CastUtil.*;

然后在代码中可以编写
castString(someObject)

可以修改Clojure以生成代码,该代码在尝试执行强制转换之前检查此条件,然后向您提供更多信息。

此问题在最近的Clojure Conj上讨论过,通常被认为是编译器中需要解决的问题。在事后,您还不能做很多事情来改进堆栈跟踪,但请放心,您并不是唯一一个寻求改进的人


编译器很有可能将解析树提供给构建工具,使人们能够创建能够解释堆栈跟踪和打印更有意义的消息的工具,尽管这些事情需要时间。

Clojure中有两个框架,分别称为和,它们用于增强打印堆栈跟踪时看到的消息。看看下面的例子

以下是clojure repl中的正常堆栈跟踪:

user=> (java.util.Date. "foo")
java.lang.IllegalArgumentException (NO_SOURCE_FILE:0)
增强的堆栈跟踪:

user=> (use 'clojure.stacktrace)
nil
user=> (print-stack-trace *e 5)
clojure.lang.Compiler$CompilerException: java.lang.IllegalArgumentException (NO_SOURCE_FILE:0)
 at clojure.lang.Compiler.eval (Compiler.java:4658)
    clojure.core/eval (core.clj:2035)
    clojure.main$repl__7403$read_eval_print__7415.invoke (main.clj:183)
    clojure.main$repl__7403.doInvoke (main.clj:200)
    clojure.lang.RestFn.invoke (RestFn.java:426)

不能,除非使用自定义JVM


当类强制转换在运行时发生时,JVM负责实例化一个
ClassCastException
,填充它的消息并抛出它。在热点中,消息构造部分采用C++实现;请参阅第1479行中的方法
generate\u class\u cast\u message
(这是OpenJDK 6;代码在JDK 7中稍微重新组织了一下,但原理保持不变).

我不太明白:除了整数的值之外,
不能将整数0转换为字符串
还包含哪些信息?基本上,异常会告诉你你需要知道的一切:对象的类,你想强制转换到的类,强制转换发生的代码行。所以,你的消息唯一不同的地方就是你包含了它试图强制转换的值?我知道答案是肯定的。这个值会告诉你什么?它将如何帮助您修复该cast错误?该值可以为我提供有关问题来源的线索。问得好!我自己也曾多次遇到同样的问题。。。弄清楚到底发生了什么事需要令人沮丧的很长时间。我想知道Clojure-devel团队是否已经收到了这方面的功能请求。你没有回答他的问题。他明确地说他不想接球。你没有回答他的问题。他明确地说他不想被抓住。是的,这实际上解决了他问题的这个非常局部的例子。不确定他是否想要一个更通用的解决方案。这是一个很好的解决方案,但它不能解决我的问题。提供了一些额外的信息。提供了关于我为什么要这样做的额外信息