在C#的foreach循环中,catch {}和catch {continue;}有什么区别?

6
foreach (Widget item in items)
{
 try
 {
  //do something...
 }
 catch { }
}


foreach (Widget item in items)
{
 try
 {
  //do something...
 }
 catch { continue; }
}
5个回答

20

catch { continue; } 会导致代码开始一个新迭代,跳过循环内 catch 块后面的所有代码。


9
其他答案告诉了你在您给出的代码片段中会发生什么。由于您的 catch 子句是循环中的最后一行代码,因此没有功能上的区别。如果您有跟随 catch 子句的代码,则不使用 "continue" 的版本将执行该代码。"continue" 是 "break" 的继承者,它会短路循环体的其余部分。使用 "continue" 会跳过下一个迭代,而 "break" 则完全退出循环。无论如何,请自己演示这两种行为。
for (int i = 0; i < 10; i++)
{
    try
    {
        throw new Exception();
    }
    catch
    {
    }

    Console.WriteLine("I'm after the exception");
}

for (int i = 0; i < 10; i++)
{
    try
    {
        throw new Exception();
    }
    catch
    {
        continue;
    }

    Console.WriteLine("this code here is never called");
}

8
在这种情况下,由于try是循环复合语句的最后一条语句,所以不会发生任何事情。continue将始终进入下一个迭代,或者在条件不再成立时结束循环。

3
编译器将会忽略它。这段话来自 Reflector。
public static void Main(string[] arguments)
{
    foreach (int item in new int[] { 1, 2, 3 })
    {
        try
        {
        }
        catch
        {
        }
    }
    foreach (int item in new int[] { 1, 2, 3 })
    {
        try
        {
        }
        catch
        {
        }
    }
}

2
这可能是编译器进行的优化。它非常特定于上面的示例代码。如果在catch块之后(在第二个foreach循环中)有语句,那么您可能会看到一个continue。因此,您不能说,continue总是被忽略。 - SysAdmin
@SysAdmin - 我很好奇为什么你在我的回答中没有提到continue会被忽略的地方时,你为什么要发表这样的评论。 - ChaosPandion

0
如果您的示例完全按照原样执行,那么我会说“没有区别”!
但是,如果您有语句需要在catch之后执行,那就完全不同了! catch { continue; }将跳过catch块后面的任何内容!!! catch{}仍将执行catch块后面的语句!!

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