2012-05-03 12 views
18

Me pregunto, ¿hay alguna manera de ejecutar un bloque solamente si no se lanza ninguna excepción?Pruebe atrapar finalmente: haga algo si no se lanza ninguna excepción

Lo mejor que puedo llegar a es la siguiente:

bool exception = false; 
try{ 
    // something 
}catch(Exception e){ 
    exception = true; 
}finally{ 
    if(!exception){ 
     // i can do what i want here 
    } 
} 

¿Hay una mejor manera?

+0

¿Tiene algún "retorno" dentro de su bloque de prueba? – Guillaume

+0

Las respuestas tienen 18 votos entre ellos y la pregunta 1 voto? –

+0

@Guillaume no returns – lowerkey

Respuesta

33

Sure there is: ponerlo en la parte inferior del bloque try.

try{ 
    // something 
    // i can do what i want here 
}catch(Exception e){ 
    // handle exception 
} 

Esto no es completamente equivalente a su código original en el sentido de que si "lo que quiere" tira, la excepción será capturado localmente (esto no ocurriría con su esquema original). Esto es algo que podría o no preocuparse, y hay una buena posibilidad de que el comportamiento diferente también sea el correcto.

Si usted quiere traer el comportamiento antiguo, también se puede utilizar esta variante que no requiere un finally por el simple hecho de escribir la condición "si no hay excepciones":

var checkpointReached = false; 
try{ 
    // something 
    checkpointReached = true; 
    // i can do what i want here 
}catch(Exception e){ 
    if (checkpointReached) throw; // don't handle exceptions after the checkpoint 
    // handle exception 
} 
+0

+1, buena respuesta. –

+0

Con el problema de que si repites este patrón obtienes imbricación try-catch. Por lo tanto, solo se recomienda si tiene pocas excepciones esperadas. –

+0

@dystroy: No estoy seguro de lo que quiere decir, ¿puede dar más detalles? – Jon

3

Usted don No necesito la cláusula finally.

Una solución:

bool exception = false; 
try{ 
    // something 
}catch(Exception e){ 
    exception = true; 
} 
if(!exception){ 
    // u can do what u want here 
} 

Por lo general, usted simplemente tener un retorno en su cláusula catch para que no tienen ni siquiera para la prueba:

try{ 
    // something 
}catch(Exception e){ 
    // do things 
    return; 
} 
// u can do what u want here 

o (dependiendo del uso y generalmente menos clara, especialmente si tiene más de una excepción esperada - no desea tener imbricaciones try-catch ...):

try{ 
    // something 
    // u can do what u want here 
}catch(Exception e){ 
    // do things 
} 
1

No, lo que tienes es probablemente la mejor manera de hacerlo en C#.

Esto es suponiendo que:

  • Usted no desea que el "Puedo hacer lo que quiero aquí" la ejecución de código en la parte inferior de su bloque try. (Tal vez porque no quieres excepciones en ese código para ser manejados por el bloque principal catch.)
  • Usted no desea que el "Puedo hacer lo que quiero aquí" código se ejecute por completo fuera de la try...catch...finally estructura. (Tal vez porque desea que el código se ejecute antes de que algún otro código que está sentado en el interior del bloque de finally.)
4

¿Se puede estructurar su código que el doSomething es la última instrucción en el bloque y que no tira?

bool exception = false; 
try{ 
    // something 
    doSomething(); 
} catch { 
} 
finally { 
} 
+0

@ Jeff Fosterno necesita finalmente bloquear aquí. –

+1

Supuse que había un código de limpieza repetitivo que siempre se quería ejecutar. Si no, entonces definitivamente tienes razón, es redundante. –

2

Si se encuentra: ponerlo al final del bloque try :)

1

Aunque no hay nada malo con su código, es innecesario.En pocas palabras el código que desee ejecutar en la parte inferior del bloque try:

try { 
    ... 
    // No errors to this point, run what you wanted to run in the finally. 
} 
catch(Exception e) { 
    ... 
} 
0

Creo que busca una oportunidad dentro de su intento:

try{ 
    // something 

    try{ 
     // something else not interfering with first try 
    } catch(Exception innerEx){ 
     // something else threw this innerEx 
    } 

}catch(Exception outerEx){ 
    // something threw this outerEx 
} 

Aunque esto generalmente se considera una mala práctica, Me gusta más que la versión de la bandera.

Cuestiones relacionadas