Frage Informationen zu einer Ausnahme hinzufügen


Ich möchte Informationen zu einer Stack-Trace / Exception hinzufügen.

Grundsätzlich habe ich ab sofort so etwas, was ich wirklich mag:

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

Allerdings möchte ich diese Ausnahme abfangen und zusätzliche Informationen hinzufügen, während ich immer noch den ursprünglichen Stack-Trace habe.

Zum Beispiel möchte ich das haben:

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

Also im Grunde möchte ich die ArithmeticException abfangen und, sagen wir, eine CustomException erneut ausführen (hinzufügen "Sie haben versucht, 42 durch 0 zu teilen" in diesem Beispiel), während der Stacktrace weiterhin von der ursprünglichen ArithmeticException beibehalten wird.

Was ist der richtige Weg, dies in Java zu tun?

Ist folgendes richtig:

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

9
2017-12-31 04:15


Ursprung


Antworten:


Ja, Sie können Ausnahmen wie diese in Java ab Java 1.4 verschachteln. Ich mache das die ganze Zeit. Sehen http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Throwable.html.

Wenn jemand den Stack-Trace von Ihrer benutzerdefinierten Ausnahme aus druckt, zeigt er sowohl den CustomException Stack-Trace und der Stack-Trace des Nested ArithmeticException. Sie können beliebig tief nisten.


11
2017-12-31 04:21



Sie könnten dies auch tun:

try {
     ....
} catch (ArithmeticException e) {
     ArithmeticException ae = new ArithmeticException( "You tried to divide " + x + " by " + y+" "+e.getMessage());
     ae.setStackTrace(e.getStackTrace());
     throw ae;
}

Was würde Ihnen "unsichtbare" Ausnahmen geben :-)

Update [27-September-2012]:

In Java 7: Ein weiterer cooler Trick ist:

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

11
2017-12-31 04:34