从catch块中退出for循环

8

在这种情况下,finally会被执行吗?我写了这段代码,无法确定finally是否真的会在这种情况下执行。无论答案如何,我都希望能得到一些解释。

foreach(string s in allStrings)
{
    try
    {
        //Error happens here
    }
    catch(Exception ex)
    {
        //Handle exception
        break;
    }
    finally
    {
        //Clean up code
    }
}

14
你尝试过吗? - Alex
3
我曾经做了一个实验,我测量了创建这个问题需要多长时间,以及将它放入控制台应用程序并点击“运行”的时间。结果是控制台应用程序更快。好吧,其实我没有真正进行实验,但你能理解我的意思吧。 :) - RPM1984
cough - Matt Ball
抱歉,我在深夜编写SharePoint WebPart时...是的,我稍后尝试了一下。再次为未能快速选择答案道歉。 - iJK
6个回答

8

你已经编写了90%的代码,足以回答这个问题。

继续编写。


8

是的。当控制权离开相应的try或catch块时,始终会执行finally块。(除非发生了特殊情况,比如运行时崩溃或线程被中止。)


2

根据Matt的回答,这确实是一个过度杀伤力的做法。

我建议像这样做,并确保测试通过。MSTest并不是最好的测试库,但它是“标准” :)

[TestClass()]
public class FinalClauseTester 
{ 
    private TestContext testContextInstance;
    public TestContext TestContext 
    { 
        get
        {
            return testContextInstance;
        } 
        set
        {
            testContextInstance = value; 
        } 
    } 

    [TestMethod] 
    [DeploymentItem(@"Something right goes here.")] 
    [DataSource("Something else goes here", "row", somethingOtherSetupCrap)] 
    public void TestFinalClause() 
    {

        string[] allStrings = {"1", "2", "3", "4", "5"};
        int yesCount = 0;
        foreach(string s in allStrings)
        {
            try
            {
                //Error happens here
                throw new Exception();
            }
            catch(Exception ex)
            {
                //Handle exception
                if (yesCount == 3)
                {
                    break;
                }
            }
            finally
            {
                //Clean up code
                yesCount++;
            }
        }

        // And, at the end of this loop ...
        Debug.Assert(yesCount = 3); // Or something like this.
    }
}

1
在紧迫的学校截止日期内,这样做并同时保持薪资状态是一个不好的主意;尽管这种情况有些过度,但习惯编写测试可以在遥远的未来得到回报。 - Hamish Grubijan
1
你的foreach语句没有一个闭合符号“}”。而且,由于“yesCount”从0开始,最终结果将为yesCount == 1,因为第一次循环中抛出了一个异常,调用了break`来终止循环(在运行finally块后)。 - Trisped

2

finally块会被始终调用,这就是它们被命名为finally的原因。


1

3
这个问题涉及到的是C#,而不是Java。 - cdhowie
3
注意,这个问题涉及到的是C#而不是Java(不过,你的陈述仍然正确)。 - Dirk Vollmar

1

是的,它尝试try, 然后catch捕获异常,最后finally被正常执行和捕获的异常都会被调用。我觉得这里有个机智的说法隐藏着!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接