何时引发异常会破坏 for 循环

本文关键字:for 循环 异常 何时引 | 更新日期: 2023-09-27 17:56:20

如果在我们完成循环之前抛出异常,DoSomething中的 for 循环会中断吗?

var test = new Test(...)
try{
      //do something in test
      test.DoSomething()
  }
  catch(myException e)
  {
     ''do something about this exception
  }

class Test
{
   public void DoSomething(...)
   {
         for(var i=0;i < 5; i++)
         {
                ...
                if(some smoke)
                  {
                      throw new myException {...}
                  }
                ...
          }
}

何时引发异常会破坏 for 循环

你可以通过定义一个循环来测试你的问题,看看你是否可以在异常后达到一个点:

void Main()
{
    try{
        DoSomething();
    }
    catch{
        Console.WriteLine("Yup. Breaks");
    }
}
void DoSomething()
{
    for(int i = 0; i <= 1; i++)
    {
        if(i == 0) {
            throw new NotImplementedException();
        }
        if( i != 0)
        {
            Console.WriteLine("Loop continues");
        }
    }
}

并回答您的问题:不,代码中断,因为异常本身未处理。

如果在循环中放置了一个 try/catch 块,则可以在正确处理异常后在 catch-block 中调用 continue; 以继续迭代。

的中断

public void DoSth()
{
    try
    {
        for(int i = 0; i ... ; i++)
        {
            if(...)
            {
                throw new Exception();
            }
        }
    }
    catch 
    {
    }
}

不会中断

public void DoSth()
{
    for(int i = 0; i ... ; i++)
    {
        try
        {
            if(...)
            {
                throw new Exception();
            }
        }
        catch
        {
        }
    }
}

因为当你有一个例外时,你会跳到catch块中。 当 catch 块位于 for 中时,它不会破坏 for。因为在 i 的下一次迭代中,您仍然在 for 中。

是的。

来自 如何:处理平行循环中的异常

Parallel.For 和 Parallel.ForEach 重载没有任何特殊机制来处理可能引发的异常。 在这方面,它们类似于常规的 for 和 foreach 循环(Visual Basic 中的 For 和 For each);未经处理的异常会导致循环立即终止。

通过抛出一个新myException(...)你的循环中有一个未处理的异常,所以你的循环将中断,你的异常被抛到它上面的捕获