从catch块中断出for循环

时间:2010-11-10 23:43:28

标签: c#

在这种情况下最终执行了吗?我写了这段代码,无法决定最终是否真的在这种情况下执行。无论答案是什么,我都会想要一些解释。

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

6 个答案:

答案 0 :(得分:8)

是。最后,当控件离开相应的try或catch块时,始终执行块。 (除非发生超级特殊事件,例如运行时崩溃或线程被中止。)

答案 1 :(得分:7)

您已经编写了90%的代码,您需要自己回答这个问题。

继续写作。

答案 2 :(得分:2)

实际上,最后总是调用块。这就是他们这样命名的原因......

答案 3 :(得分:2)

根据马特的回答。这确实是一种过度杀伤力。

我建议做这样的事情,并确保测试通过。 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.
    }
}

答案 4 :(得分:1)

是的,确实如此。最后总是执行块。见http://download.oracle.com/javase/tutorial/essential/exceptions/finally.html

答案 5 :(得分:1)

是的,它尝试try,然后catch捕获异常,然后最后是正常执行和捕获异常的最终调用。我觉得隐藏在某个地方有一种诙谐的想法!