Перехват необработанных исключений в дочерних потоках в WPF - PullRequest
19 голосов
/ 15 сентября 2009

У меня есть приложение 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
    //...
}

Редактировать: Как только возникает необработанное исключение, я хочу отобразить сообщение об ошибке с трассировкой стека, а затем выйти из приложения.

Ответы [ 2 ]

18 голосов
/ 15 сентября 2009

Попробуйте подключиться к событию AppDomain.CurrentDomain.UnhandledException .

3 голосов
/ 15 сентября 2009

Это специально, вы должны использовать try / catch на верхнем уровне DoWork. Некоторые многопоточные модели учитывают это, взгляните на Backgroundworker для примера.

. Класс задач .NET 4 предоставляет хороший интерфейс для решения этой проблемы. До этого вам придется самостоятельно позаботиться об этом или использовать модели BGW или IAsyncResult.

...