Application.ThreadException
olay işleyicisinde istisnalar atıp onları yakalarken bazı garip davranışlar görüyorum.Neden iç istisna ThreadException işleyicisine ulaşıyor ve gerçek atılan özel durum değil?
Temel olarak aşağıdaki örnekte neler oluyor, BackgroundWorker
'un DoWork
olay işleyicisinde bir istisnanın atılmasıdır. RunWorkerCompleted
olay işleyicisi, iç istisna olarak orijinal ile yeni bir özel durum oluşturur.
İç istisna ThreadException
olay işleyicisinde neden ortaya çıkıyor ve acutal istisna atılıyor? RunWorkerCompleted
olay işleyicisinde iç bir istisna sağlamazsam, doğru istisna görünecektir.
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);
}
}
}
Şaşırtıcı; Bu benim fark etmeden yıllardır beni ısırıyor. İşlediğim için yemin edebileceğim şeyler için bu sıkıntılı raporları görebiliyordum. Onlara bakmak için çok fazla zaman harcamayacak kadar azdı, ama nihayetinde önemli bir şeyle başlamıştı ve istisna durumun değiştiğini fark ettim. O NE LAN?? –