Con la referencia de Centralized Exception Handling en C# aplicación de Windows, me encontré con uno de buena solución:
static class Program
{
[STAThread]
static void Main()
{
// Add handler to handle the exception raised by main threads
Application.ThreadException +=
new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
// Add handler to handle the exception raised by additional threads
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
// Stop the application and all the threads in suspended state.
Environment.Exit(-1);
}
static void Application_ThreadException
(object sender, System.Threading.ThreadExceptionEventArgs e)
{// All exceptions thrown by the main thread are handled over this method
ShowExceptionDetails(e.Exception);
}
static void CurrentDomain_UnhandledException
(object sender, UnhandledExceptionEventArgs e)
{// All exceptions thrown by additional threads are handled in this method
ShowExceptionDetails(e.ExceptionObject as Exception);
// Suspend the current thread for now to stop the exception from throwing.
Thread.CurrentThread.Suspend();
}
static void ShowExceptionDetails(Exception Ex)
{
// Do logging of exception details
MessageBox.Show(Ex.Message, Ex.TargetSite.ToString(),
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
En la clase anterior, vamos a asociar un controlador de eventos para dos eventos. Es mejor adjuntar estos eventos tan pronto como comience el método principal.
Application.ThreadException - Este evento se generará cuando se genere una excepción en el hilo principal. Si agregamos un manejador de eventos, entonces la excepción se maneja sobre el método.
AppDomain.CurrentDomain.UnhandledException - Este evento se generará cuando se genere una excepción en los subprocesos adicionales utilizados en la aplicación. El peor escenario aquí es que, tan pronto como la ejecución de los controladores termina, la excepción se lanza de nuevo mientras la aplicación finaliza. Esto necesita ser manejado. Aquí he usado un poco de código para manejar esta situación y continuar la ejecución de la aplicación sin interrupción.
La lógica que he utilizado para superar esta situación es simplemente suspender el hilo en el controlador de eventos, para que la aplicación siga funcionando bien. Nuevamente surge un problema al suspender este hilo. Cuando se cierra el formulario principal, la aplicación normalmente necesita salir, pero como el hilo está en estado suspendido, la aplicación seguirá ejecutándose. Por lo tanto, para salir de la aplicación por completo y detener el proceso, se debe llamar a Environment.Exit (-1) antes de que finalice el método principal.
dónde colocar esta pieza de código, si usted tiene cualquier referencia o puede publicar un ejemplo, estaré muy bien, lleno. – ykh
Ver el enlace de MSDN en mi respuesta. Tiene un ejemplo: http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx – gideon