C # Должен ли я зацикливаться, пока не исключение? - PullRequest
8 голосов
/ 25 октября 2009

Я хочу пройти один раз через цикл, но только если выброшено исключение, вернуться через цикл. Как бы я написал это в C #?

Спасибо

Ответы [ 6 ]

21 голосов
/ 25 октября 2009

Это пахнет плохим дизайном для меня. Общее правило: исключения должны не использоваться для управления потоком. Есть ряд причин для этого; а именно, обычно есть лучшие / более надежные методы, которые можно использовать для проверки перед тем, как генерируются исключения, а также это снижает эффективность.

Тем не менее, просто ради аргумента, вы можете сделать что-то вроде следующего:

while (true)
{
    try
    {
        // do stuff here
    }
    catch (MyException)
    {
        continue;
    }

    // all is good
    break;
}

Опять же - это не рекомендуемый способ. Я был бы рад предложить что-то лучшее, если бы вы могли предоставить немного больше контекста / examples /

3 голосов
/ 07 октября 2010

Как насчет следующего, где вы можете установить количество повторов:

            int tryCount = 0;

            while (tryCount < 3)
            {
                try
                {
                    someReturn = SomeFunction(someParams);
                }
                catch (Exception)
                {
                    tryCount++; 
                    continue;
                }
                break; 
            }
1 голос
/ 25 октября 2009

Кажется, это плохая идея, но в любом случае попробуйте что-то вроде этого:

bool exceptionthrown = false;
while (!exceptionthrown)
{
  try
  {
    // Do magic here
  }
  catch (Exception)
  {
    exceptionthrown = true;
    throw;
  }
}
1 голос
/ 25 октября 2009

Это действительно зависит от того, что вы делаете, и от типа создаваемого исключения. Многие исключения не являются чем-то, что можно было бы исправить, просто повторив попытку с теми же самыми входами / данными, и, таким образом, цикл просто продолжал бы генерировать исключение до бесконечности.

Вместо этого вам следует проверить наличие соответствующих исключений, а затем обработать их соответствующим образом для этих конкретных исключений.

0 голосов
/ 25 октября 2009

Что-то вроде:

bool done = false;
while( ! done )
{
  try
  {
    DoSomething();
    done = true;
  } catch(Exception ex)
  {
    HandleException(ex);
  }
}

Как сказал Нолдорин, это пахнет плохим дизайном. Вы используете исключения для управления потоком программы. Лучше иметь явные проверки для условий, которые заставят вас повторить операцию.

0 голосов
/ 25 октября 2009

Почему бы не вызвать функцию, которая на самом деле выполняет цикл, и получить после нее перехват, который вызовет функцию снова.

private void loop() {
  for(...) {
  }
}

какой-то другой метод:

try {
  loop();
} catch(Exception e) {
  loop();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...