dev@glassfish.java.net

handling unexpected exceptions

From: Bill Shannon <bill.shannon_at_sun.com>
Date: Wed, 13 May 2009 17:39:22 -0700

I have a bunch of code in JavaMail that looks roughly like this:

        try {
            // do something that might fail for unknown reasons
        } catch (Exception ex) {
            // clean up, close connections, etc.
            throw MyException();
            // or...
            return null;
            // or...
            continue;
        }

The "do something" can fail for lots of reasons - NPE, IOException, etc. -
usually several levels deep. No matter what goes wrong I want to detect
the failure and clean things up, especially making sure not to leave any
connections open.

FindBugs complains about this because "do something" doesn't throw
Exception.

An alternative I've used in a few places is something like this:

        boolean success = false;
        try {
            // do something
            success = true;
        } finally {
            if (!success) {
                // clean up, close connections, etc.
                throw MyException();
                // or...
                return null;
                // or...
                continue;
            }
        }

Does that seem better? Or would it be better to filter out the FindBugs error?

Introducing the artificial "success" variable seems kind of ugly, and the
code seems less clear, although "finally" *does* seem like a good fit for
what I'm trying to do.

How do other people handle cases like this?