I have my own exception, thrown by my class, BrowserException.
It may be because some internal problem, i.e. UnsupporderEncodingException.
Now I have 2 options:
In exceptions, what is the difference between suppressedException and cause?
When will I prefer to use each of them?
A suppressed exception is one which would have happened if another exception hadn't occurred. I'm only aware of one case where this happens, which is with a try-with-resources statement. The JLS (14.20.3) says:
Resources are closed in the reverse order from that in which they were initialized. A resource is closed only if it initialized to a non-null value. An exception from the closing of one resource does not prevent the closing of other resources. Such an exception is suppressed if an exception was thrown previously by an initializer, the try block, or the closing of a resource.
So suppose you're trying to write to a file stream on a USB stick, and the USB stick is remove. The
write call throws an
IOException - but so does the
close call, because it's trying to flush a buffer. The original exception from the
write call will be the one the caller sees, but they'll be able to get at the one thrown by
close as a suppressed exception.
An exception has a cause if it's effectively the result of transforming one exception into another. Suppose you're writing a SQL system that talks to the local file system. Your JDBC driver methods can only throw
SQLException, so what do you do if your underlying code throws an
IOException because it can't read from disk? You may want the details of the
IOException to be visible in the
SQLException, so you pass that into the constructor of
SQLException - the
IOException is the cause of the exception.
You're unlikely to ever need to add suppressed exceptions yourself, but creating one exception that's caused by another (typically through the constructor rather than by calling
initCause) is reasonably common.
See more on this question at Stackoverflow