Sto osservando un comportamento strano quando lancio le eccezioni e le cattura nel gestore di eventi Application.ThreadException
.Perché l'eccezione interna raggiunge il gestore ThreadException e non l'effettiva eccezione generata?
Fondamentalmente, cosa sta succedendo nell'esempio seguente è che un'eccezione viene generata nel gestore di eventi DoWork
di BackgroundWorker
. Il gestore di eventi RunWorkerCompleted
ripropone una nuova eccezione con l'originale come eccezione interna.
Perché l'eccezione interna viene visualizzata nel gestore di eventi ThreadException
e non viene generata l'eccezione acutale? Se non fornisco un'eccezione interna nel gestore di eventi RunWorkerCompleted
, verrà visualizzata l'eccezione corretta.
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);
}
}
}
Sorprendente; questo mi ha morso per anni senza che me ne accorgessi. Vedrei questi rapporti di errore occasionali per cose che potrei giurare che ho gestito. Erano abbastanza rari da non passare molto tempo a guardarli, ma alla fine ha iniziato a succedere qualcosa di significativo, e ho capito che l'eccezione stava cambiando lungo la strada. WTF ?? –