2009-10-24 14 views
6

Quiero ir una vez a través de un bucle, pero solo si se lanza una excepción regrese al ciclo. ¿Cómo escribiría esto en C#?C# ¿Debería buclear hasta que no haya ninguna excepción?

Gracias

+0

No me queda claro a qué se refiere. ¿Por qué no publica un código, dice lo que quiere que sea el resultado y qué sucede en realidad? – RossFabricant

+0

Me pregunto si el plan es hacer un bucle, y si hay una excepción, omita el objeto problema y continúe el ciclo, pero eso es solo una suposición. –

Respuesta

1

parece una mala idea, pero de todos modos probar algo como esto:

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

Este código no volverá al ciclo si se lanza una excepción. De hecho, el código agregado no logra exactamente nada. – lockstock

19

Esto huele mal diseño para mí. La regla general es: se deben usar excepciones para no para el control de flujo. Hay un número de razones para esto; es decir, generalmente hay métodos mejores/más confiables que se pueden usar para verificar cosas antes de lanzar una excepción, y también disminuye la eficiencia.

No obstante, sólo por el bien de la discusión, usted podría hacer algo como lo siguiente:

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

    // all is good 
    break; 
} 

de nuevo - esta es no la forma recomendada. Estaría encantado de sugerir algo mejor si pudiera proporcionar un poco más de contexto/ejemplos/

+1

Se me ocurren algunas circunstancias en las que este no es un diseño inherentemente malo (por ejemplo, reintentar una operación de red escamosa en una excepción de tiempo de espera), pero no muchas. –

+0

Tal vez el sistema se basa en la respuesta de la base de datos y tienes que esperar hasta que funcione. –

+0

Esta es una respuesta mucho mejor que la respuesta aceptada real – derekantrican

1

Eso realmente depende de lo que esté haciendo y del tipo de excepción que se genere. Muchas excepciones no son algo que se solucione al intentar nuevamente con exactamente las mismas entradas/datos, y así el bucle simplemente seguiría generando la excepción ad infinitum.

En su lugar, debe verificar las excepciones relevantes y luego manejarlas de manera adecuada para esas excepciones particulares.

0

¿Por qué no llamar a una función que realmente hace el bucle, y tener una trampa después de él que llamaría a la función de nuevo.

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

algún otro método:

try { 
    loop(); 
} catch(Exception e) { 
    loop(); 
} 
+1

Esto es problemático si la excepción se produce nuevamente la segunda vez. – RandomGuy

0

Algo así como:

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

Como dijo noldorin , huele como un mal diseño. Está utilizando excepciones para controlar el flujo del programa. Es mejor tener comprobaciones explícitas de las condiciones que provocarán que repita la operación.

2

¿Qué hay de la siguiente donde se puede establecer una cuenta de reintentos:

  int tryCount = 0; 

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