Search code examples
exceptionfinally

Does try/finally ignore exceptions?


I have a situation where I want certain code to be executed no matter what happens, but I need exceptions to also be passed on up the stack to be handled later. Is the following:


try
{
  // code
}
finally
{
  // code that must run
}

going to just ignore any exceptions, or will it pass them on up? My testing seems to show that they still get passed on up, but I want to be sure I'm not crazy.

EDIT: My question isn't about when and if the finally will execute, it's about whether exceptions still get thrown upwards, but that's been answered now.


Solution

  • Here's a test class that shows that (1) finally runs, regardless of whether exceptions are thrown; and (2) exceptions are passed along to the caller.

    public class FinallyTest extends TestCase {
        private boolean finallyWasRun   = false;
    
        public void testFinallyRunsInNormalCase() throws Exception {
            assertFalse(finallyWasRun);
            f(false);
            assertTrue(finallyWasRun);
        }
    
        public void testFinallyRunsAndForwardsException() throws Exception {
            assertFalse(finallyWasRun);
            try {
                f(true);
                fail("expected an exception");
            } catch (Exception e) {
                assertTrue(finallyWasRun);
            }
        }
    
        private void f(boolean withException) throws Exception {
            try {
                if (withException)
                    throw new Exception("");
            } finally {
                finallyWasRun = true;
            }
        }
    }