Estoy usando el evento Application.ThreadException para manejar y registrar excepciones inesperadas en mi aplicación winforms.Muy extraño Comportamiento Application.ThreadException
Ahora, en algún lugar de mi solicitud, tengo el siguiente código (o más bien algo equivalente, pero este código ficticio es suficiente para reproducir mi problema):
try
{
throw new NullReferenceException("test");
}
catch (Exception ex)
{
throw new Exception("test2", ex);
}
Estoy esperando claramente mi Application_ThreadException controlador para pasar la excepción "test2", pero este no es siempre el caso. Normalmente, si otro hilo marshals mi código a la interfaz de usuario, mi controlador recibe la excepción de "prueba", exactamente como si no hubiera atrapado "prueba" en absoluto.
Aquí hay una breve muestra que reproduce este comportamiento. He omitido el código del diseñador.
static class Program
{
[STAThread]
static void Main()
{
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
//Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); // has no impact in this scenario, can be commented.
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
//this handler is never called
}
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
Console.WriteLine(e.Exception.Message);
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
button1.Click+=new EventHandler(button1_Click);
}
protected override void OnLoad(EventArgs e) {
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ThrowEx));
t.Start();
}
private void button1_Click(object sender, EventArgs e)
{
try
{
throw new NullReferenceException("test");
}
catch (Exception ex)
{
throw new Exception("test2", ex);
}
}
void ThrowEx()
{
this.BeginInvoke(new EventHandler(button1_Click));
}
}
La salida de este programa en mi equipo es:
test
... here I click button1
test2
que he reproducido en este .net 2.0,3.5 y 4.0. ¿Alguien tiene una explicación lógica?
Respuesta modificada. –
Su sugerencia tiene sentido, pero esto no cambia el comportamiento extraño. – Brann
@Brann, tienes razón.El extraño comportamiento persiste. Sin embargo, lo he corregido al no hacer 'catch (Exception ex)' en el controlador de clic de botón, sino más bien 'catch'. Muy interesante. Una excepción no descendente y de Excepción lanzada. –