Подтвердить что ты не робот

С#, используя "Продолжить" в catch catch try

Теперь у меня серьезная проблема с оператором continue. FetchUnseenMessages может или не может возвращать ошибку в зависимости от того, может ли она подключиться к указанной учетной записи электронной почты. Я хочу, чтобы оператор continue возвращался к следующему элементу в инструкции foreach (попытка следующей учетной записи электронной почты), если FetchUnseenMessages терпит неудачу. Я получаю неожиданные результаты. Я не верю, что оператор continue переходит к следующему элементу в инструкции foreach, но возвращается к началу инструкции try и повторяет попытку. Я застрял на этом весь день, и я довольно застрял. Пожалуйста помоги. Спасибо, Крис.

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

    //Other code
}
4b9b3361

Ответ 1

Вы можете использовать флаг переменной bool, заданный в блоке catch, и выполнить оператор continue после catch, если флаг указывает на выполнение блока catch.

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 самого внутреннего заявления о попытке. Когда и если контроль достигнет цели точка блока finally, управление передается блоку finally следующего прилагаемого утверждения try. Этот процесс повторяется до тех пор, пока наконец, блоки всех промежуточных утверждений try были выполненный, msdn.

Изменить. По заданным данным поведение продолжения должно быть нормальным, и у вас не должно быть никаких проблем. У вас может быть другая проблема, например, замыкающая переменная в цикле, вы можете узнать больше о закрытии переменной здесь.

Я проверил тест, чтобы проверить данный сценарий, и он выглядит нормальным.

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

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