2009-10-21 19 views
23

un programa en C# es invocado por:¿Es posible probar/capturar todo el programa C#?

Application.Run (new formClass()); 

me gustaría poner un try/catch alrededor de todo el asunto para atrapar cualquier excepciones no capturadas. Cuando lo puse alrededor de este método Run, las excepciones no son atrapadas; el control solo vuelve aquí cuando el programa finaliza después de una excepción no detectada.

¿Dónde puedo poner try/catch para cubrir todo el programa? ¡Gracias!

+4

Creo que se está perdiendo el objetivo del proceso de excepción, si una excepción sube a la capa superior de su aplicación, entonces hay algo mal que necesita abordar más abajo en el código. Ponga try/catch alrededor del código que cree que podría fallar y proporcione mitigación (cuando sea posible) en la captura. Si no se puede mitigar, es decir, la aplicación no se puede recuperar, entonces la aplicación debe fallar. – Lazarus

+13

El OP no pregunta cómo se deben usar las excepciones, sino cómo atraparlas en un escenario determinado. Obviamente, si una excepción se propaga a la capa superior, entonces algo está mal, parece que quiere obtener más información cuando algo está mal para poder abordarla. La respuesta de Mitch es mucho más útil que suponer que el operador no sabe lo que está haciendo. – Maggie

+9

La captura de todas las excepciones en el nivel superior puede ser muy útil para hacer un esfuerzo final para informar lo que sucedió antes de salir. En muchos casos, creo que esto es mejor que ver el diálogo estándar de Windows "este programa se ha bloqueado, infórmalo a Microsoft". – noctonura

Respuesta

37

Para detectar las excepciones no controladas de Windows Form, conecte los eventos AppDomain.UnhandledException y Application.ThreadException.

De interés: Unexpected Errors in Managed Applications

+2

@alankdkd: asegúrese de leer hasta el final y de la sección "Algunas mejores prácticas";) – Lazarus

+1

No puede detectar una excepción con 'AppDomain.UnhandledException' (aún terminará la aplicación), sino que simplemente recibe una notificación. Esta es una diferencia importante en comparación con 'Application.ThreadException' que es una captura de excepción. – Lucero

+0

No puedo hacer que UnhandledException funcione. Lo he intentado:

 AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler); 
Pero cuando hay una excepción, nunca se llama a MyHandler. Voy a intentar ThreadException ... – user20493

8

Básicamente, no se puede capturar todas las excepciones cuando se utiliza el CLR predeterminado proceso de alojamiento. Período. Esto se debe a que el evento AppDomain.UnhandledException es solo una notificación, no puede manejar la excepción (lo que significa que no puede evitar que la aplicación finalice después de procesar la notificación).

Sin embargo, puede capturar y manejar todas las excepciones en el hilo de interfaz de usuario de una aplicación de Windows Forms mediante el uso de su manejador Application.ThreadException (y control the behavior través UnhandledExceptionMode). Otros hilos que arrojen una excepción no serán capturados por este manejador.

En general, no es una buena idea tratar de manejar todas las excepciones. Sin embargo, puede usar el AppDomain.UnhandledException para registrar el error y/o realizar tareas de limpieza importantes (por ejemplo, cerrar un base de datos basado en archivos o lo que sea).

Cuestiones relacionadas