11

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


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

会忽略任何异常,还是会将它们传递出去?我的测试似乎表明它们仍然可以通过,但我想确定我没有发疯。

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

4

4 回答 4

18

正如您所说,finally代码将始终运行,并且异常将向上传递。这几乎就是关键try/finally- 让一些代码始终运行,即使抛出异常也是如此。

编辑:对于任何提供try/finally构造的语言都是如此,但对于某些语言有一些警告,正如亚当在他的评论中指出的那样,萨姆在他的回答中指出。

于 2009-07-06T23:06:55.213 回答
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;
        }
    }
}
于 2009-07-06T23:19:07.013 回答
3

假设这是 C#,finally 将始终运行,除非您收到StackOverflowExceptionExecutingEngineException

此外,像 ThreadAbortException 这样的异步异常可能会中断 finally 块的流程,导致它部分执行。

查看相关问题:

在 C# 中,如果抛出未处理的异常,Finally 块是否会在 try、catch、finally 中执行?

于 2009-07-06T23:36:08.963 回答
2

如果这是 C#

这里的答案是正确的,finally 运行并且异常被“传递”。但是为了说明弄清楚它是多么容易:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            throw new Exception("testing");
        }
        finally
        {
            Console.WriteLine("Finally");
        }
    }
}

当运行这个简单的小控制台应用程序时,会抛出异常,然后执行 finally 块。

于 2009-07-07T00:32:08.410 回答