NoozNooz42
NoozNooz42

Reputation: 4328

Adding info to an exception

I'd like to add information to a stack trace/exception.

Basically I've got something like this as of now, which I really like:

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

However I'd like to catch that exception and add additional info to it, while still having the original stack trace.

For example, I'd like to have that:

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

So basically I want to catch the ArithmeticException and rethrow, say, a CustomException (adding "you tried to divide 42 by 0" in this example) while still keeping the stacktrace from the original ArithmeticException.

What is the correct way to do this in Java?

Is the following correct:

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

Upvotes: 13

Views: 7615

Answers (2)

Pat
Pat

Reputation: 5911

You could also do this :

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

Which would give you "invisible" exceptions :-)

Update [27-september-2012] :

In Java 7: another cool trick is:

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

Upvotes: 14

Brian Clapper
Brian Clapper

Reputation: 26211

Yes, you can nest exceptions like that in Java, as of Java 1.4. I do this all the time. See http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Throwable.html.

When someone prints the stack trace from your custom exception, it'll show both the CustomException stack trace and the stack trace of the nested ArithmeticException. You can nest arbitrarily deeply.

Upvotes: 14

Related Questions