2012-02-14 17 views
12

Quiero ejecutar el código en el bloque try nuevamente después de capturar una excepción. ¿Es eso posible de alguna manera?¿Es posible ejecutar el código en el bloque try nuevamente después de una excepción en atrapado en el bloque catch?

Por ejemplo:

try 
{ 
    //execute some code 
} 
catch(Exception e) 
{ 
} 

Si se detecta la excepción que quiero ir en el bloque try de nuevo a "ejecutar algún código" e inténtelo de nuevo para ejecutarlo.

+0

no, no es un sistema incorporado en forma estándar, pero usted puede construir su propia –

+0

posible duplicado de [Intenta/excepción de capturas continuará a partir de la línea que causó la excepción] (http://stackoverflow.com/questions/7125352/try-catch-exception-continue-from-line-that-cause-the-exception), [Try-Catch y "Continue" - ¿esto es posible?] (http://stackoverflow.com/questions/6146248/try-catch-and-continue-is-this-possible), [Capturar y continuar] (http://stackoverflow.com/questions/7113929/catch-and-continue) –

+1

@SunilKumarBM útil cuando se realiza una llamada a un sitio web/servicio web dudoso que expira con frecuencia o incluso arroja 500 errores. – SynXsiS

Respuesta

25

Ponlo en un bucle. Posiblemente un ciclo de tiempo alrededor de un indicador booleano para controlar cuándo finalmente quiere salir.

bool tryAgain = true; 
while(tryAgain){ 
    try{ 
    // execute some code; 
    // Maybe set tryAgain = false; 
    }catch(Exception e){ 
    // Or maybe set tryAgain = false; here, depending upon the exception, or saved details from within the try. 
    } 
} 

Solo tenga cuidado para evitar un bucle infinito.

Un mejor enfoque puede ser poner su "código" dentro de su propio método, luego puede llamar al método tanto desde el try como el catch, según corresponda.

0

Esto debería funcionar:

count = 0; 
while (!done) { 
    try{ 
    //execute some code; 
    done = true; 
    } 
    catch(Exception e){ 
    // code 
    count++; 
    if (count > 1) { done = true; } 
    } 
} 
+0

por qué usar flags, está ejecutando un bucle for aquí. así que usa una estructura de bucle para. –

3

Si envuelve el bloque en un método, de forma recursiva puede llamar

void MyMethod(type arg1, type arg2, int retryNumber = 0) 
{ 
    try 
    { 
     ... 
    } 
    catch(Exception e) 
    { 
     if (retryNumber < maxRetryNumber) 
      MyMethod(arg1, arg2, retryNumber+1) 
     else 
      throw; 
    } 
} 

o podría hacerlo en un bucle.

int retries = 0; 

while(true) 
{ 
    try 
    { 
     ... 
     break; // exit the loop if code completes 
    } 
    catch(Exception e) 
    { 
     if (retries < maxRetries) 
      retries++; 
     else 
      throw; 
    } 
} 
+3

Y luego también se puede ejecutar en stackoverflow debido a que no hay punto final. –

1

Hay otra manera de hacerlo (aunque como otros han mencionado, no es realmente recomendable). Aquí hay un ejemplo que utiliza un reintento de descarga de archivos para que coincida más con la palabra clave retry que se encuentra en Ruby en VB6.

RetryLabel: 

try 
{ 
    downloadMgr.DownLoadFile("file:///server/file", "c:\\file"); 
    Console.WriteLine("File successfully downloaded"); 
} 
catch (NetworkException ex) 
{ 
    if (ex.OkToRetry) 
     goto RetryLabel; 
} 
+0

usando la etiqueta no es una buena práctica de codificación –

+3

Parece mucho más claro que la recursividad o bucles infinitos para resolver este problema en particular. – Bill

+1

Desafortunadamente, eso es exactamente lo que potencialmente lograste aquí: un ciclo infinito. Si se produce la excepción y no se hace nada para resolver la causa subyacente, no hay un contador de reintento o tal para detener el ciclo. La comprobación 'ex.OkToRetry' podría ser un comienzo para esto, pero no está claro si esto o cuándo se establecerá de manera diferente entre' true' y 'false'. – ziesemer

0

¿Qué pasa con el ole goto?

Start: 
      try 
      { 
       //try this 
      } 
      catch (Exception) 
      { 

       Thread.Sleep(1000); 
       goto Start; 
      } 
0
int tryTimes = 0; 
while (tryTimes < 2) // set retry times you want 
{ 
    try 
    { 
     // do something with your retry code 
     break; // if working properly, break here. 
    } 
    catch 
    { 
     // do nothing and just retry 
    } 
    finally 
    { 
     tryTimes++; // ensure whether exception or not, retry time++ here 
    } 
} 
Cuestiones relacionadas