Ответ 1
Попробуйте подключиться к событию AppDomain.CurrentDomain.UnhandledException.
У меня есть приложение WPF, которое объединяет несколько потоков. Я определил обработчик события DispatcherUnhandledException в App.xaml.cs, который отображает подробное сообщение об ошибке, и этот обработчик вызывается каждый раз, когда поток пользовательского интерфейса встречает исключение. Проблема связана с дочерними потоками: их необработанные исключения никогда не обрабатываются. Как это сделать?
Пример кода:
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
//...
}
Изменить: Как только произойдет необработанное исключение, я хочу отобразить сообщение об ошибке со стеком, а затем выйти из приложения.
Попробуйте подключиться к событию AppDomain.CurrentDomain.UnhandledException.
Это по дизайну, вы должны использовать try/catch на верхнем уровне DoWork. Некоторые модели резьбы удовлетворяют этому, посмотрите пример фонаря.
Класс .NET 4 Task обеспечивает хороший интерфейс для этой проблемы. До тех пор вам придется позаботиться об этом самостоятельно или использовать модели BGW или IAsyncResult.