Envolver cualquier pieza de código en un bloque try
/catch
sin una buena razón es una mala práctica.
En el modelo de programación .NET, las excepciones se deben reservar para casos o condiciones verdaderamente excepcionales. Debe solo tratar de detectar excepciones que realmente puede hacer algo acerca de. Además, difícilmente debería tomar la clase base System.Exception
(pero preferiría captar las clases de excepciones derivadas más específicas que puede manejar). Y si se produce una excepción verdaderamente inesperada durante el curso de la ejecución de su programa, usted realmente debería bloquearse.
Obviamente, la respuesta "correcta" tendría que hacerse caso por caso, dependiendo de lo que esté sucediendo dentro de ese marcador de posición // code
en su bloque catch
. Pero si está pidiendo una regla general o una "mejor práctica", siempre debe tener una razón específica para detectar excepciones, no simplemente envolver todo su código en un bloque try
/catch
gigante como una cuestión de rutina sin pensarlo. .
Tenga en cuenta que si simplemente está tratando de detectar cualquier excepción no controlada que pueda ocurrir con el propósito de registrar o informar errores, debe usar el AppDomain.UnhandledException
event. Este es un evento solo de notificación, por lo que no le permite hacer esas excepciones, pero es el lugar correcto para implementar su funcionalidad de registro o informe de errores después de que su aplicación se haya bloqueado.
EDIT: Como estaba poniendo al día en mi lectura del excelente blog de Raymond Chen, "The Old New Thing", me di cuenta de que había publicado recientemente un artículo sobre un tema similar. Es específico de COM, en lugar de .NET Framework, pero los conceptos generales con respecto al manejo de errores son igualmente aplicables a ambos entornos. Pensé en compartir un par de gemas del artículo aquí, en apoyo de mi opinión [aparentemente bastante controvertida].
Históricamente, COM realizó una prueba gigante/excepto alrededor de los métodos de su servidor. Si su servidor encontró lo que normalmente sería una excepción no controlada, el gigante try/except lo detectaría y lo convertiría en el error RPC_E_SERVERFAULT
. A continuación, marcó la excepción como manejada, de modo que el servidor permaneció en ejecución, con lo que "mejoró la solidez al mantener el servidor en funcionamiento incluso cuando se encontró con un problema".
Eso sí que fue un flaco servicio.
El hecho de que se haya producido una excepción no controlada significa que el servidor se encontraba en un estado inesperado. Al detectar la excepción y decir "No te preocupes, todo está bien", terminas dejando un servidor dañado funcionando.
[. . . ]
Capturar todas las excepciones y dejar que el proceso continúe ejecutándose supone que un servidor puede recuperarse de una falla inesperada. Pero esto es absurdo. Ya sabes que el servidor está increíblemente bien: ¡se colgó!
Mucho mejor es dejar que el servidor se bloquee para poder capturar el volcado de fallo en el punto de la falla. Ahora tienes una oportunidad de luchar para descubrir qué está pasando.
Puedes [y deberías] leer todo el artículo aquí en su blog: How to turn off the exception handler that COM "helpfully" wraps around your server.
depende de lo que viene como '// code' –
Pregunta relacionada: http: // stackoverflow.com/questions/2730078/in-c-how-do-i-know-which-exceptions-to-catch –