adelphus February 2016

Intercept and rethrow a Java unhandled exception

I've coded a method with a catch-all handler, but I need to rethrow the exception as if it were unhandled, so that a caller (much) further up the call stack can handle it. The trivial way to do this is simply:

try {
   ...
} catch (Exception ex) {
   // do something here...
   // and rethrow
   throw ex;
}

But the problem is that, because of the throw statement, Java requires this method to declare itself as throws Exception, which in turn, requires all the callers to handle the exception or declare themselves as throws Exception. And so on up the call chain...

Is there any simple way to rethrow the exception as if the current method did not handle it?

Answers


tddmonkey February 2016

You could do what @radoh has said and just wrap into a RuntimeException, but one downside of this is your stacktrace is now polluted and will show the offending line to be where you declare throw new RuntimeException(ex).

An alternative is to use Lomboks SneakyThrows mechanism, like this:

public static void main(String[] args) {
    methodWithException();
}

private static void methodWithException() {
    try {
        throw new Exception("Hello");
    } catch (Exception e) {
        Lombok.sneakyThrow(e);
    }
}

Your stacktrace will remain intact, but you no longer need to declare throws Exception.

It's worth reading the documentation on why you should/shouldn't do this


Andy Turner February 2016

You have exactly two options with (checked) exceptions:

  1. Handle them in the method via a try/catch (which may include rethrowing as a different exception type)
  2. Declare that the method throws the exception.

If you want to rethrow the exception as if this method did not catch it, your only option is 2.

Note: you only want to catch (Exception e) if a method in the try block actually throws Exception. Otherwise, catch the specific exception types.

Post Status

Asked in February 2016
Viewed 1,668 times
Voted 12
Answered 2 times

Search




Leave an answer