2012-06-25 59 views
10

Esto no es 'Cómo atrapar todas las excepciones', sino más bien '¿Debería capturar todas las excepciones'? En C# .NET he notado una gran cantidad de excepciones. ¿Es aconsejable planear atrapar todas las excepciones?¿Debería detectar todas las excepciones?

Por ejemplo, el constructor DirectoryInfo() arroja 4 excepciones. ¿Debo planear atrapar estos o solo atrapar los que puedo manejar? Tal vez dejar que los demás burbujeen hasta Main() donde tengo un catch-all que luego le dice al usuario que hay una excepción no detectada. Parece que con todas estas posibles excepciones, su código podría convertirse en un manejo de excepciones más que el código real.

+0

http://stackoverflow.com/questions/1454266/net-catch-general-exceptions http://stackoverflow.com/questions/1742940/why-not-catch-general-exceptions –

+4

Personalmente, uso 'finally 'a ** lote ** más que nunca uso' catch' –

+2

@marc: ¿Es por eso que no pude abrir preguntas hace unos minutos? ;) –

Respuesta

14

Capture solo las que tengan sentido para el nivel de abstracción en el que está escribiendo el código. La mayoría de las excepciones solo se detectarán a un nivel mucho más alto que donde se lanzan.

Así que sí, estás en lo cierto. :)

+3

Esto. Solo maneje excepciones que pueda, bueno, manejar. – hometoast

0

Por lo general, solo debe detectar excepciones que sepa cómo manejar. El propósito de las excepciones que burbujean es permitir que otras partes del código las capturen si pueden manejarlas, por lo que capturar todas las excepciones en un nivel probablemente no le dará el resultado deseado.

En el nivel superior, es posible que desee tener un resumen para darle al usuario un mensaje de error amistoso, y eso indicaría que su programa está manejando mal algo, y es posible que deba averiguar cómo manejarlo es correcto

Hay algunos casos (como un OutOfMemoryException), que realmente no hay manera de manejar con elegancia (que no sea la salida), y definitivamente debe dejarlos burbujear al menos hasta la interfaz de usuario para una salida elegante.

2

Debe detectar las excepciones que está esperando, y fallar con gracia en las excepciones que no está esperando (atrapándolas en un controlador de excepción general).

En su ejemplo - la creación de DirectoryInfo() puede lanzar múltiples excepciones - pero no hay ninguna razón por la que no puede simplemente

try 
{ 
    var di = new DirectoryInfo(somePath); 
} 
catch(Exception ex) 
{ 
    // Messagebox/alert the user etc, gracefully exit/cancel/throw if needed 
} 

Puede ser que se desea capturar la excepción de seguridad y proporcionar algún otro código , hágalo, pero conserve su controlador de 'caja general'

try 
{ 
    var di = new DirectoryInfo(somePath); 
} 
catch(SecurityException ex) 
{ 
    // Carry on but use a default path or something etc 
} 
catch(Exception ex) 
{ 
    // Messagebox/alert the user etc, gracefully exit/cancel 
} 
0

Simplemente atrape las que pueda y quiera manejar.
La lógica es bastante simple, ¿qué vas a hacer con el resto de los "lanzamientos"?
a menos que haya algo (lógica \ logging \ mensajes de error) que desee hacer y que simplemente va a volver a lanzar, entonces no tiene motivos para atrapar.

Cuestiones relacionadas