C#使用Continue在try catch中捕获

时间:2014-02-26 04:36:34

标签: c# asp.net

现在,我对continue语句有一个重大问题。 FetchUnseenMessages可能会也可能不会返回错误,具体取决于它是否能够连接到指定的电子邮件帐户。如果FetchUnseenMessages失败,我希望continue语句返回到foreach语句中的下一个项目(尝试下一个电子邮件帐户)。我得到了一些意想不到的结果。我不相信continue语句会转到foreach语句中的下一个项目,但会回到try语句的开头并再次尝试它。我整天都被困在这里,而且我很困难。请帮忙。谢谢,克里斯。

foreach (string l in lUserName)
{ 
    try
    {
        newMessages = FetchUnseenMessages(sUsername);
    }
    catch
    {
        continue;
    }

    //Other code
}

1 个答案:

答案 0 :(得分:26)

你可以使用catch块中设置的bool变量标志,并在catch if if flag表示执行catch块后执行continue语句。

foreach (string l in lUserName)
{ 
   bool isError = false;  //flag would remain flase if no exception occurs 
   try
   {
       newMessages = FetchUnseenMessages();
   }
   catch
   {
       isError = true;
   }
   if(isError) continue;   //flag would be true if exception occurs
   //Other code 
}
  

如果continue语句退出一个或多个具有关联的try块   最后块,控制最初转移到finally块   最里面的try语句。何时以及如果控制到达终点   最后一个块的点,控制转移到finally块   下一个封闭的try语句。重复该过程直到   所有干预尝试陈述的最后几块都是   执行,msdn

编辑根据给定的详细信息,continue的行为应该是正常的,不应该有任何问题。您可能还有其他问题,例如closure variable in a loop,您可以阅读有关变量闭包here的更多信息。

我做了一个测试来验证给定的场景,看起来很正常。

for (int i = 0; i < 3; i++)
{
    try
    {
    Console.WriteLine("Outer loop start");
    foreach (int l in new int[] {1,2,3})
    {       
        Console.WriteLine("Inner loop start");
        try
        {
            Console.WriteLine(l);
             throw new Exception("e");
        }
        catch
        {
            Console.WriteLine("In inner catch about to continue");
            continue;
        }           
        Console.WriteLine("Inner loop ends after catch");

    }
    Console.WriteLine("Outer loop end");
    }
    catch
    {
        Console.WriteLine("In outer catch");
    }
}

在catch

中使用continue的输出
Outer loop start
Inner loop start
1
In inner catch about to continue
Inner loop start
2
In inner catch about to continue
Inner loop start
3
In inner catch about to continue
Outer loop end
Outer loop start
Inner loop start
1
In inner catch about to continue
Inner loop start
2
In inner catch about to continue
Inner loop start
3
In inner catch about to continue
Outer loop end
Outer loop start
Inner loop start
1
In inner catch about to continue
Inner loop start
2
In inner catch about to continue
Inner loop start
3
In inner catch about to continue
Outer loop end

循环变量附件

List<Func<int>> actions = new List<Func<int>>();
int variable = 0;
while (variable < 3)
{
    actions.Add(() => variable * variable);
    ++ variable;
}

foreach (var act in actions)
{
    Console.WriteLine(act.Invoke());
}

循环外壳变量的输出

9
9
9

循环变量封装的解决方案,制作循环变量的副本并将其传递给操作。

while (variable < 3)
{
    int copy = variable;
    actions.Add(() => copy * copy );
    ++ variable;
}

输出

0
1
4