我想将信息添加到堆栈跟踪/异常。
基本上我现在有类似的东西,我非常喜欢:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.so.main(SO.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
但是我想捕获该异常并向其添加其他信息,同时仍然具有原始堆栈跟踪。
例如,我想拥有:
Exception in thread "main" CustomException: / by zero (you tried to divide 42 by 0)
at com.so.main(SO.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
所以基本上我想要捕获ArithmeticException并重新抛出一个CustomException(在这个例子中添加“你试图将42除以0”),同时仍然保持堆栈跟踪不受原始ArithmeticException的影响。
在Java中执行此操作的正确方法是什么?
以下是否正确:
try {
....
} catch (ArithmeticException e) {
throw new CustomException( "You tried to divide " + x + " by " + y, e );
}
答案 0 :(得分:11)
是的,从Java 1.4开始,您可以在Java中嵌套类似的异常。我一直这样做。请参阅http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Throwable.html。
当有人从您的自定义异常中打印堆栈跟踪时,它将显示CustomException
堆栈跟踪和嵌套ArithmeticException
的堆栈跟踪。你可以任意深入地嵌套。
答案 1 :(得分:11)
你也可以这样做:
try {
....
} catch (ArithmeticException e) {
ArithmeticException ae = new ArithmeticException( "You tried to divide " + x + " by " + y+" "+e.getMessage());
ae.setStackTrace(e.getStackTrace());
throw ae;
}
哪会给你“看不见的”例外:-)
更新[2012年9月27日]:
在Java 7中:另一个很酷的技巧是:
try {
...
} catch (ArithmeticException e) {
e.addSuppressed(new ArithmeticException( "You tried to divide " + x + " by " + y));
throw e;
}