tags:

views:

333

answers:

6

I want to go once through a loop but only if an exception is thrown go back through the loop. How would I write this in C#?

Thanks

+8  A: 

This smells of bad design to me. The general rule is: exceptions should not be used for flow control. There are a number of reasons for this; namely, there are usually better/more reliable methods that can be used to check things before an exceptions is thrown, and also it decreases efficiency.

Nonetheless, just for the sake of argument, you could do something like the following:

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

    // all is good
    break;
}

Again - this is not the recommended way. I would be happy to suggest something better if you could provide a bit more context/examples/

Noldorin
I can think of some circumstances where this isn't inherently bad design (e.g. retrying a flaky network operation on a timeout exception), but not many.
Robert Rossney
+1  A: 

That really depends on what you're doing, and the type of exception being thrown. Many exceptions aren't something that would be fixed by just trying again with the exact same inputs/data, and thus looping would just keep generating the exception ad infinitum.

Instead, you should check for relevant exceptions and then handle them in an appropriate manner for those particular exceptions.

Amber
A: 

Why not call a function that actually does the loop, and have a catch after it that would call the function again.

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

some other method:

try {
  loop();
} catch(Exception e) {
  loop();
}
James Black
This is problematic if the exception is thrown again the second time through.
scandido
+1  A: 

Seems like a bad idea but anyway try something like this :

bool exceptionthrown = false;
        while (!exceptionthrown)
        {
            try
            {
                // Do magic here
            }
            catch (Exception)
            {
                exceptionthrown = true;
                throw;
            }
        }
Yassir
A: 

Something like:

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

As Noldorin said, it smells like a bad design. You're using exceptions to control the flow of the program. Better to have explicit checks for the conditions that will cause you to repeat the operation.

Andrew Kennan
A: 

What about the following where you can set a retry count:

            int tryCount = 0;

            while (tryCount < 3)
            {
                try
                {
                    someReturn = SomeFunction(someParams);
                }
                catch (Exception)
                {
                    tryCount++; 
                    continue;
                }
                break; 
            }
oguy