2010-07-13 20 views
38

Normalmente, me gustaría hacer esto:Prueba múltiple o uno?

try 
{ 
    code 

    code that might throw an anticipated exception you want to handle 

    code 

    code that might throw an anticipated exception you want to handle 

    code 
} 
catch 
{ 

} 

¿Hay beneficios a hacerlo de esta manera?

code 

try 
{ 
    code that might throw an anticipated exception you want to handle 
} 
catch 
{ 
} 

code 

try 
{ 
    code that might throw an anticipated exception you want to handle 
} 
catch 
{ 
} 

code 

Actualización:

originalmente hice esta pregunta w/referencia a C#, pero como comentó A. Levy, se podría aplicar a cualquier idioma manejo de excepciones, así que hice las etiquetas reflejan eso.

+5

¿Desea que el proceso se detenga tan pronto como se produzca el primer error (el primer ejemplo) o puede continuar incluso si una parte del proceso falla (la otra)? –

+1

@DLP - Me gustaría que dejara de procesar: veo a alguien mencionarlo después de ti. Ese es un buen punto. – Steve

+3

Aunque etiquetó esto con C# y .net, creo que realmente es independiente del idioma. Esta pregunta se aplica a cualquier idioma con excepciones como Java, C++, JavaScript, OCaml, F #, Python, Clojure, etc. También se aplicaría al sistema de condición/reinicio en Common Lisp y varios otros Lisps. Entonces te pediría que hicieras que este lenguaje fuera independiente ... Tu llamada, sin embargo. –

Respuesta

49

Depende. Si desea proporcionar un tratamiento especial para los errores específicos a continuación, utilizar varios bloques catch:

try 
{ 
    // code that throws an exception 
    // this line won't execute 
} 
catch (StackOverflowException ex) 
{ 
    // special handling for StackOverflowException 
} 
catch (Exception ex) 
{ 
    // all others 
} 

Sin embargo, si la intención es manejar una excepción y continuar con la ejecución, colocar el código en bloques try-catch separadas:

try 
{ 
    // code that throws an exception 

} 
catch (Exception ex) 
{ 
    // handle 
} 

try 
{ 
    // this code will execute unless the previous catch block 
    // throws an exception (re-throw or new exception) 
} 
catch (Exception ex) 
{ 
    // handle 
} 
+1

+1 por agregar el comentario sobre la ejecución adicional que no mencioné. –

+2

+1, resaltado en el primer ejemplo, asegúrese de que el manejador de excepciones generales sea el último en la declaración, de modo que maneje primero primero y luego todo lo demás fuera de su control se maneje de forma genérica. – leeroya

+0

Como se indica aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch, El uso de capturas condicionales no es estándar y no está en una norma pista. No lo use en sitios de producción frente a la Web: no funcionará para todos los usuarios. También puede haber grandes incompatibilidades entre implementaciones y el comportamiento puede cambiar en el futuro. – JLavoie

2

Segundo método es mejor en mi opinión, ya que permite atrapar errores con más precisión.
Además, envolver todo su código dentro de un gran bloque try/catch es malo, si su aplicación tiene algún tipo de problema y falla, pero como atrapó una gran aplicación genérica, la posibilidad de manejarla correctamente es menor. Debería tener partes especiales dentro de la captura de prueba, como si estuviera leyendo un archivo o respondiendo a las sugerencias del usuario. De esa manera usted puede manejar mejor que exeception

0

segundo camino, pero lo ideal es el uso de guardias de código - try/catch es costoso

+2

Probar/atrapar en C# no es realmente muy costoso, a menos que realmente atrape algo ... –

+0

PD: Me doy cuenta de que esta respuesta es de 7 años pero quiero ponerlo en contexto de 2017 .... El golpe de ejecución de Try/Catch está muy por encima de lo presupuestado y las ganancias de rendimiento imaginario NUNCA son una buena razón para obtener un código mejor y más confiable, especialmente cuando te das cuenta de cuándo salió .NET la mejor computadora que podías comprar era un Pentium 4 w/1-2GB y hoy tiene 4 núcleos, hiper hilos, eso es más de 8 veces la velocidad, y 8-16 GB de RAM es la norma. Además de eso, el código compilado de .NET también es más rápido que hace 15 años, incluso en el mismo hardware. Llamar a Try/Catch slow es un mito y necesita detenerse. – TravisO

10

Ni, sólo tiene que utilizar varios bloques de captura para las excepciones específicas (a menos que haya sólo una tonelada de código en el bloque y solo un par de líneas pueden arrojar una excepción. En ese caso yo iría con el segundo método).

8

Si pudiera elegir el segundo probablemente separaría esto en dos funciones.

+4

+1: Estoy totalmente de acuerdo, aunque probablemente escribiría esto como "Si pudiera elegir el segundo, lo haría ...", ya que creo que esto es lo correcto para hacer en cualquier momento que sea posible ... –

+0

@Reed , buena sugerencia, publicación actualizada para tener en cuenta. Gracias. –

2

Prefiero el segundo método: hace que la depuración sea más fácil, el manejo de errores es más preciso y también se alimenta muy bien en las pruebas de la unidad.

1

Segundo método. Mantener el código que podría arrojar una excepción separada de otro código - mantiene la sección más pequeña y fácil de administrar en lugar de envolver todo el código, incluso eso que no arrojará excepciones.

2

Iría por la segunda opción, pero cada vez que veo este patrón de código, mi primer sentimiento es pensar en dividirlo en múltiples funciones/métodos. Obviamente si hacerlo depende de lo que está haciendo el código;)

2

Depende de la naturaleza del tipo de errores que suceden en su código.

  1. Si el manejo de esos errores que va a hacer es lo mismo ir por solo intento ... atrapar para ese grupo de código. De lo contrario, será demasiado tedioso.

  2. Si los errores requieren un manejo diferente, sepárelo porque es necesario.

NO APLIQUE UN MÉTODO ÚNICO PARA TODOS LOS CASOS.LA MAYOR PARTE DE LA HORA ES CONTEXT ESPECÍFICA :)

Debe alcanzar el equilibrio entre "BUENO/COMPLEJO" y "MALO/SIMPLE". Cuanto más codifique, menos estará atrapado en este tipo de dilema :)

¡Feliz programación!

+1

En general, es deficiente escribir una oración completa en mayúsculas y minúsculas. Pero al final, eso es contexto específico –

+0

@Joe Philllips: Gracias por recordarnos. – ttchong

4

Estás pensando de esta manera incorrecta. ¿Qué necesitas hacer en tus bloques de captura? Si desea recuperar de cualquiera de las posibles excepciones ejecutando el mismo código, no importa qué operación arrojó la excepción, utilice un bloque catch. Si necesita hacer diferentes operaciones de limpieza dependiendo de qué operación arrojó, entonces use múltiples bloques catch.

Además, si puede usar try/finally o el patrón RAII en lugar de try/catch, entonces debería hacerlo.

+2

+1 para el patrón RAII, pero dudo que OP lo esté pensando de la manera incorrecta. –

Cuestiones relacionadas