I have a WPF application that spins off several threads. I have defined a DispatcherUnhandledException event handler in App.xaml.cs that displays a detailed error message, and this handler gets called every time the UI thread encounters an exception. The problem is with the child threads: their unhandled exceptions never get handled. How do I do this?
Sample code:
private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
MessageBox.Show("detailed error message");
}
private void Application_Startup(object sender, StartupEventArgs e)
{
//...
//If an Exception is thrown here, it is handled
//...
Thread[] threads = new Thread[numThreads];
for(int i = 0; i < numThreads; i++)
{
threads[i] = new Thread(doWork);
threads[i].Start();
}
}
private void doWork()
{
//...
//Exception thrown here and is NOT handled
//...
}
Edit: Once an unhandled exception occurs, I want to display an error message with a stack trace, and then exit the application.
This is by design, you should use a try/catch at the top-level of DoWork. Some threading models cater for this, take a look at the Backgroundworker for an example.
The .NET 4 Task class provides a nice interface to this problem. Until then, you will have to take care of it yourself, or use the BGW or IAsyncResult models.
Try hooking up to the AppDomain.CurrentDomain.UnhandledException event as well.