尝试/最终忽略异常吗?

时间:2009-07-06 23:05:42

标签: exception exception-handling finally

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


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

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

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

4 个答案:

答案 0 :(得分:17)

如您所说,finally代码将始终运行,异常将被传递。这就是try/finally的重点 - 让一些代码始终运行,即使抛出异常也是如此。

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

答案 1 :(得分: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;
        }
    }
}

答案 2 :(得分:3)

假设这是C#,除非得到StackOverflowExceptionExecutingEngineException

,否则最终会一直运行

此外,ThreadAbortException之类的异步异常可以中断finally块的流,从而导致它部分执行。

参见相关问题:

In C# will the Finally block be executed in a try, catch, finally if an unhandled exception is thrown?

答案 3 :(得分:2)

如果这是C#

这里的答案是正确的,最终运行并且异常被“传递”。但要说明解决它是多么容易:

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块。