向异常添加信息

2022-09-04 07:40:03

我想将信息添加到堆栈跟踪/异常。

基本上,到目前为止,我有这样的东西,我真的很喜欢:

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

因此,基本上我想捕获算术异常并重写,例如,自定义异常(在本例中添加“您尝试将42除以0”),同时仍保留原始算术异常的堆栈跟踪。

在Java中执行此操作的正确方法是什么?

以下是否正确:

try {
     ....
} catch (ArithmeticException e) {
     throw new CustomException( "You tried to divide " + x + " by " + y, e );
}

答案 1

是的,从 Java 1.4 开始,您可以在 Java 中嵌套类似的异常。我一直在这样做。请参阅 http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Throwable.html

当有人从您的自定义异常中打印堆栈跟踪时,它将同时显示嵌套 的堆栈跟踪和堆栈跟踪。您可以任意深嵌套。CustomExceptionArithmeticException


答案 2

你也可以这样做:

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;
}