Pregunta

Posibles Duplicados:
.NET - ¿Cuál es la mejor forma de implementar un "capturar todas las excepciones de controlador"

Tengo un .NETO de la aplicación de consola, la aplicación que está fallando y mostrar un mensaje al usuario.Todos los de mi código está en un try{<code>} catch(Exception e){<stuff>} bloque, pero aún así los errores son de vez en cuando aparece.

En una aplicación Win32, puede capturar todas las excepciones posibles o accidentes por instalar varios controladores 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 .NETO mundo para que yo pueda manejar/log/reservados todos los posibles casos de error?

¿Fue útil?

Solución

Contrariamente a lo que algunos otros han publicado, no hay nada de malo en que la captura de todas las excepciones.Lo importante es ocuparse de todos ellos de forma adecuada.Si usted tiene un desbordamiento de pila o la condición de memoria, la aplicación debe cerrarse para ellos.También, tenga en cuenta que OOM condiciones pueden impedir que el controlador de excepciones de funcionar correctamente.Por ejemplo, si el controlador de excepciones muestra un cuadro de diálogo con el mensaje de excepción, si usted está fuera de la memoria, puede no ser suficiente para la izquierda el cuadro de diálogo de la pantalla.Mejor para iniciar y cerrar inmediatamente.

Como han mencionado otros, hay la UnhandledException y ThreadException eventos que pueden llevar a la colección de excepciones que de otro modo podrían obtener perdidas.A continuación, basta con lanzar un controlador de excepción de todo el ciclo principal (suponiendo una aplicación winforms).

También, usted debe ser consciente de que OutOfMemoryExceptions no siempre son lanzados para condiciones de falta de memoria.Una OOM condición puede desencadenar todo tipo de excepciones, en el código, o en el marco, que no necesariamente tiene nada que ver con el hecho de que la real condición subyacente está fuera de la memoria.He visto con frecuencia InvalidOperationException o ArgumentException cuando la causa subyacente es realmente fuera de la memoria.

Otros consejos

Usted puede agregar un controlador de eventos para el dominio de aplicación.Evento UnhandledException, y será llamado cuando una excepción es lanzada y no se detecta.

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

El Global.asax la clase es la última línea de defensa.Mira:

protected void Application_Error(Object sender, EventArgs e)

método

Ser conscientes de que algunos de excepción son peligrosos para la captura o la mayoría uncatchable,

  • OutOfMemoryException:cualquier cosa que hagas en la captura controlador podría asignar memoria (en el administrado o no administrado lado de la CLR) y por lo tanto desencadenar otro OOM
  • StackOverflowException:dependiendo de si el CLR se detecta lo suficientemente temprano, usted puede ser notificado.Peor de los casos, simplemente mata el proceso.

Usted puede utilizar el dominio de aplicación.CurrentDomain.UnhandledException para conseguir un evento.

Aunque la captura de todos excepciones sin el plan de manejar adecuadamente ellos es sin duda una mala práctica, creo que una aplicación debe fallar en algunos graciosa manera.Un accidente no debe asustar al usuario a la muerte, y que al menos debería mostrar una descripción de la error, algunos a reportar información a la tecnología de apoyo material y lo ideal es que un botón para cerrar la aplicación y reinicie.En un mundo ideal, la aplicación debe ser capaz de volcar en el disco los datos de usuario y, a continuación, intente recuperarlo (pero veo que esto es pedir demasiado).

De todos modos, yo suelo usar:

AppDomain.CurrentDomain.UnhandledException

También puede ir con la Aplicación.ThreadException Evento.

Una vez que yo era el desarrollo de una .NETO de la aplicación que se ejecuta dentro de un COM basa la solicitud;este evento fue muy útil, como dominio de aplicación.CurrentDomain.UnhandledException no funciona en este caso.

Creo que se debe más bien a que no coger todas la Excepción, pero mejor dejar que ellos se muestra al usuario.La razón de esto es que usted solo debe capturar las Excepciones que en realidad se puede manejar.Si te encuentras con alguna Excepción que hace que el programa se detenga, pero todavía la captura, esto podría causar problemas mucho más graves.Leer también Preguntas más frecuentes:¿Por qué FxCop advertir contra catch(Exception)?.

Ser conscientes de que la captura de estas excepciones no controladas pueden cambiar los requisitos de seguridad de la aplicación.Su aplicación podría dejar de funcionar correctamente en ciertos contextos (cuando se ejecuta desde un recurso compartido de red, etc.).Asegúrese de probar a fondo.

no me duele el uso de ambos Dominio de aplicación.CurrentDomain.UnhandledException Aplicación.ThreadException

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top