现在,我对continue语句有一个重大问题。 FetchUnseenMessages可能会也可能不会返回错误,具体取决于它是否能够连接到指定的电子邮件帐户。如果FetchUnseenMessages失败,我希望continue语句返回到foreach语句中的下一个项目(尝试下一个电子邮件帐户)。我得到了一些意想不到的结果。我不相信continue语句会转到foreach语句中的下一个项目,但会回到try语句的开头并再次尝试它。我整天都被困在这里,而且我很困难。请帮忙。谢谢,克里斯。
foreach (string l in lUserName)
{
try
{
newMessages = FetchUnseenMessages(sUsername);
}
catch
{
continue;
}
//Other code
}
答案 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