La cláusula de captura en su fragmento nunca captará nada en la versión de envío de su aplicación. Es funciona cuando lo ejecuta con un depurador conectado.
Lo que hace falta es la forma en que se comporta Application.ThreadException. Ese evento se dispara cada vez que se detecta una excepción no controlada. Sin embargo, esta característica está habilitada para al depurar el código. No se instaló ningún manejador de excepciones para levantar el evento. Esto se hizo para que tenga una forma decente de depurar excepciones no controladas. Su código cambia ese comportamiento, ahora hay es un bloque de prueba activo, su controlador de captura recibe la excepción.
Para que el código se comporte de la misma manera, deberá cambiar la estrategia de manejo de excepciones no controladas. De esta manera:
[STAThread]
static void Main() {
try {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
Application.Run(new Form1());
}
catch (Exception ex) {
// etc..
}
}
Ahora su cláusula catch siempre tendrá la excepción. Siempre que se genere en el hilo principal, no detectará las excepciones planteadas en los hilos de trabajo. Considere este código en su lugar para el manejo unificado:
[STAThread]
static void Main() {
AppDomain.CurrentDomain.UnhandledException += AllUnhandledExceptions;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
Application.Run(new Form1());
}
private static void AllUnhandledExceptions(object sender, UnhandledExceptionEventArgs e) {
var ex = (Exception)e.ExceptionObject;
// Display or log ex.ToString()
//...
Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(ex));
}
gracias por su gran consejo – armin
¿Funciona esto en WPF o solo en Windows Forms? –