Estoy viendo un comportamiento extraño al lanzar excepciones y atraparlas en el controlador de eventos Application.ThreadException
.¿Por qué la excepción interna llega al controlador ThreadException y no a la excepción lanzada real?
Básicamente lo que está sucediendo en el ejemplo siguiente es que se produce una excepción en el controlador de eventos DoWork
de BackgroundWorker
. El controlador de eventos RunWorkerCompleted
vuelve a lanzar una nueva excepción con el original como la excepción interna.
¿Por qué aparece la excepción interna en el controlador de eventos ThreadException
y no se produce la excepción acutal? Si no proporciono una excepción interna en el controlador de eventos RunWorkerCompleted
, se mostrará la excepción correcta.
using System;
using System.Windows.Forms;
using System.ComponentModel;
namespace WierdExceptionApp
{
class WierdExceptionForm : Form
{
BackgroundWorker worker = new BackgroundWorker();
public WierdExceptionForm()
{
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
throw new Exception("worker_RunWorkerCompleted", e.Error);
}
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
throw new Exception("worker_DoWork");
}
[STAThread]
static void Main()
{
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Application.Run(new WierdExceptionForm());
}
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
MessageBox.Show(e.Exception.Message);
}
}
}
Astounding; esto me ha estado picando durante años sin que me haya dado cuenta. Veía estos informes ocasionales de errores por cosas que podría jurar que manejé. Eran lo suficientemente raros como para no pasar mucho tiempo buscándolos, pero finalmente comenzó a suceder algo significativo, y me di cuenta de que la excepción estaba cambiando a lo largo del camino. ¿WTF? –