Cómo atrapar TODAS las excepciones / lockings en una aplicación .NET

Posible duplicado:
.NET: ¿Cuál es la mejor manera de implementar un controlador de excepciones “catch all”?

Tengo una aplicación de consola .NET que se cuelga y muestra un mensaje al usuario. Todo mi código está en un bloque try{} catch(Exception e){} , pero todavía se muestran ocasionalmente errores.

En una aplicación Win32, puede capturar todas las excepciones / lockings posibles instalando varios manejadores de excepciones:

 /* C++ exc handlers */ _set_se_translator SetUnhandledExceptionFilter _set_purecall_handler set_terminate set_unexpected _set_invalid_parameter_handler 

¿Cuál es el equivalente en el mundo de .NET para poder manejar / registrar / silenciar todos los posibles casos de error?

Contrariamente a lo que otros han publicado, no hay nada de malo en capturar todas las excepciones. Lo importante es manejarlos adecuadamente. Si tiene un desbordamiento de stack o una condición de falta de memoria, la aplicación debe cerrarse para ellos. Además, tenga en cuenta que las condiciones OOM pueden evitar que su manejador de excepciones se ejecute correctamente. Por ejemplo, si su manejador de excepciones muestra un cuadro de diálogo con el mensaje de excepción, si no tiene memoria, puede que no haya suficiente para la visualización del diálogo. Lo mejor es iniciar sesión y cerrar de inmediato.

Como otros mencionaron, existen los eventos UnhandledException y ThreadException que puede manejar para excepciones de colección que de otra manera podrían perderse. Luego simplemente arroje un manejador de excepciones alrededor de su ciclo principal (asumiendo una aplicación de winforms).

Además, debe tener en cuenta que las OutOfMemoryExceptions no siempre se lanzan para las condiciones de falta de memoria. Una condición OOM puede desencadenar todo tipo de excepciones, en su código o en el marco, que no necesariamente tienen que ver con el hecho de que la condición real subyacente está fuera de la memoria. Frecuentemente he visto InvalidOperationException o ArgumentException cuando la causa subyacente está realmente fuera de la memoria.

Puede agregar un controlador de eventos al evento AppDomain.UnhandledException, y se invocará cuando se produzca una excepción y no se capture.

Este artículo en codeproject de nuestro anfitrión Jeff Atwood es lo que necesita. Incluye el código para detectar excepciones no controladas y las mejores prácticas para mostrar información sobre el locking al usuario.

La clase Global.asax es tu última línea de defensa. Mirar:

 protected void Application_Error(Object sender, EventArgs e) 

método

Tenga en cuenta que algunas excepciones son peligrosas de capturar o, en su mayoría, no capturables.

  • OutOfMemoryException: cualquier cosa que haga en el controlador catch puede asignar memoria (en el lado administrado o no administrado del CLR) y desencadenar así otro OOM
  • StackOverflowException: dependiendo de si el CLR lo detectó con suficiente anticipación, es posible que reciba una notificación. En el peor de los casos, simplemente mata el proceso.

Puede usar AppDomain.CurrentDomain.UnhandledException para obtener un evento.

A pesar de que capturar todas las excepciones sin el plan para manejarlas adecuadamente es una mala práctica, creo que una aplicación debería fallar de alguna manera elegante. Un choque no debería asustar al usuario hasta la muerte, y al menos debería mostrar una descripción del error, cierta información para informar al soporte técnico e, idealmente, un botón para cerrar la aplicación y reiniciarla. En un mundo ideal, la aplicación debería poder volcar en el disco los datos del usuario y luego tratar de recuperarlo (pero veo que esto es pedir demasiado).

De todos modos, suelo usar:

 AppDomain.CurrentDomain.UnhandledException 

También puede ir con Application.ThreadException Event.

Una vez desarrollé una aplicación .NET ejecutándose dentro de una aplicación basada en COM; este evento fue muy útil, ya que AppDomain.CurrentDomain.UnhandledException no funcionó en este caso.

Creo que debería preferir no capturar todas las excepciones, pero mejor que se las muestre al usuario. La razón de esto es que solo debe capturar Excepciones que realmente pueda manejar. Si se encuentra con alguna Excepción que hace que el progtwig se detenga pero aún lo atrape, esto podría causar problemas mucho más graves. Lea también Preguntas frecuentes: ¿Por qué FxCop advierte contra la captura (Excepción)? .

Tenga en cuenta que la captura de estas excepciones no controladas puede cambiar los requisitos de seguridad de su aplicación. Su aplicación puede dejar de ejecutarse correctamente en ciertos contextos (cuando se ejecuta desde un recurso compartido de red, etc.). Asegúrate de probarlo a fondo.

no hace daño usar AppDomain.CurrentDomain.UnhandledException Application.ThreadException

pero tenga en cuenta que las excepciones en subprocesos secundarios no son detectadas por estos controladores; utilice SafeThread para subprocesos secundarios si es necesario