2010-04-30 10 views
11

Tengo por ejemplo, un try/catch en mi método:salida try/catch para evitar que el código después de que se ejecuten

} 
    catch (OurCustomExceptionObject1 ex) 
    { 
     txtErrorMessage.InnerHtml = "test 1"; 
    } 
    catch(OurCustomExceptionObject2 ex) 
    { 
     txtErrorMessage.InnerHtml = "test 2"; 
    } 
    catch (OurCustomExceptionObject3 ex) 
    { 
     txtErrorMessage.InnerHtml = "test 3"; 
    } 

    ... rest of code here is being executed after the try/catch 

no quiero que el resto del código se ejecute si alguna de las excepciones son atrapados. Estoy manejando las excepciones. Escuché que no use Exit Try por alguna razón. ¿Es cierto, es malo hacer esto? ¿Es esta la forma correcta de detener la ejecución del código después de la declaración catch?

+1

'Salir existe Try' sólo en VB.NET. No se aplica a C#. En C#, la característica de idioma correspondiente sería 'break', pero eso es ilegal en un bloque' try..catch..finally'. La siguiente mejor opción sería 'return', que no hace lo mismo, pero es algo perfectamente legal. – stakx

+0

@stakx 'break' no es ilegal en el bloque' catch'. Se puede usar para salir del lazo. –

Respuesta

30

O bien return en el catch-block, vuelva a lanzar la excepción, o mueva el código de debajo del try-block dentro del try-block.

+0

Precisamente lo que iba a responder – BlitzKrieg

+2

Sí. Y creo que mover el código es el mejor enfoque en este caso. Si desea evitar que el código continúe cuando haya una excepción, no haga nada. Una excepción ya interrumpe el flujo de ejecución. Simplemente rodee todo con un try-catch si quiere manejar la operación también. Aunque si se trata de un método, rodearía la llamada al método en lugar del cuerpo del método, por lo que las excepciones no se tragarán involuntariamente. –

+0

sí, eso es cierto. pero en mi caso el resto del código tanto. ¿Está bien poner una gran cantidad de código en una declaración try? porque entonces cada captura en esa parte quedará atrapada bajo una captura al final y, por ejemplo, no podré a qué excepción se refiere a dónde. – Disasterkid

1

dos opciones vienen a la mente:

  1. return directamente desde el interior de cada catch (como se sugiere BlueRaja)
  2. establecer un indicador (por ejemplo, errorOccurred) dentro de los bloques de catch las excepciones no lo hace quiere permitir, a continuación, poner if (errorOccurred) return; después de todo el bloque try/catch

Este último poder ser más rea Dable a otros desarrolladores, ya que es fácil pasar rápidamente lo que sucede dentro de un catch para descubrir lo que sucede después. Ver un evidente if (errorOccurred) return; hace que sea bastante difícil malinterpretar lo que sucedió.

1

Desde una vista de alto nivel, creo que esto podría ser una violación de (al menos) el Principio de Responsabilidad Individual si su código intenta hacer algo que podría fallar, y luego continuar para hacer algunas cosas más.

En aras de una respuesta, sin embargo, si usted quiere hacer un corte (que siempre es malo, así que no lo hacen) que podría hacer

bool success = true; 
try 
{ 
    // the good ol' college try 
} 
catch (...) 
{ 
    success = false; 
} 

if (success) 
{ 
    // do the rest of your stuff 
} 

edición: o, alternativamente, como se sugiere BlueRaja, poner todo de su código en el bloque try. Si el primer bit falla, falla. El resto del código no se ejecutará de todos modos.

+0

No lo sé. Todo depende de la situación y la lógica que debe tener lugar. No veo por qué el procesamiento posterior dañaría algo si todo lo que está haciendo para manejar los errores esperados es al iniciar sesión y pasar al siguiente código en el método después de la captura. – PositiveGuy

Cuestiones relacionadas