尝试/最终忽略异常吗?

Mat*_*t H 10 exception-handling exception finally

我有一种情况,我希望无论发生什么事情都要执行某些代码,但我需要将异常传递到堆栈中以便稍后处理.以下是:


try
{
  // code
}
finally
{
  // code that must run
}
Run Code Online (Sandbox Code Playgroud)

只是忽略任何异常,还是会将它们传递给它们?我的测试似乎表明他们仍然被传递,但我想确定我不是疯了.

编辑:我的问题不是关于何时以及最终是否会执行,而是关于异常是否仍然被抛出,但现在已经得到了回答.

Ric*_*dle 17

finally代码将始终运行和异常会向上传递,就像你说的.这几乎就是try/finally- 有一些代码总是会运行,即使抛出异常也是如此.

编辑:对于提供try/finally构造的任何语言都是如此,但是对于某些语言有一些警告,正如Adam在他的评论中指出的那样,Sam在他的回答中指出了这一点.

  • 有一些边缘情况,其中finally块不运行(*某些*语言中的StackOverflowException,进程终止,电源线被拉动等),但在大多数情况下,finally块将运行,然后向下传播异常. (2认同)

Car*_*ter 9

这是一个测试类,它显示(1)最终运行,无论是否抛出异常; (2)异常传递给调用者.

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)