2015-06-15 5 views
-5

Будет ли цикл for в 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 {...} 
        } 

       ... 
      } 
} 
+2

Вы пробовали? Простое выполнение кода ответит на ваш вопрос. – Ric

+1

Как петля «ломается»? Что вы подразумеваете под _ «до того, как мы достигнем someInt-1» _? См. [For (C# Reference)] (https://msdn.microsoft.com/en-us/library/ch45axte.aspx) для порядка выполнения цикла 'for'. Ваш вопрос: «Будет ли цикл цикла« try-catch »зацикливаться на цикле, если одна итерация выдает исключение« _? – CodeCaster

ответ

0

Вы могли бы просто проверили вопрос, определив петлю и посмотреть, если вы можете достичь точки после исключения:

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 внутри вашего цикла, вы можете вызвать continue; в своем блоке catch после того, как ваше исключение было обработано надлежащим образом для продолжения итерации.

0

Да.

От How to: Handle Exceptions in Parrallel loops

Перегрузка Parallel.For и Parallel.ForEach не имеет какой-либо специальный механизм для обработки исключений, которые могут быть отброшены. В этом отношении они напоминают регулярные петли foreach и foreach (для и для каждого в Visual Basic); необработанное исключение приводит к немедленному завершению цикла.

Бросая новый myException(...) у вас есть необработанное исключение в цикле и поэтому ваш цикл будет ломаться и ваше исключение брошено до улова над ним

0

Перерывы для

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. Потому что в следующей итерации i вы все еще в for.

Смежные вопросы