Поймать ошибку в Application.ThreadException из другого потока - PullRequest
1 голос
/ 22 февраля 2012

У меня есть окна из приложения с кодом program.cs, как это:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.ThreadException += (sndr, evnt) => 
        { 
            MessageBox.Show("An error occur. Please contact your administrator.\nError description: " + 
                evnt.Exception.Message + "\nStack trace:\n" + evnt.Exception.StackTrace, 
                evnt.Exception.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error); 
        };
        Application.Run(new frmLogin());
    }
}

Но когда в событии BackgroundWorker.DoWork возникает исключение, Application.ThreadException не улавливает его.

Как Application.ThreadException может перехватить исключение из другого потока, созданного BackgroundWorker?

Я знаю, что перехват ошибок в Application.ThreadException не является хорошей практикой, но мы используем его только как наш последний уровень перехвата ошибок.

Мой код на C #, framework 4, сборка в VS2010 Pro.

Пожалуйста, помогите. Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 22 февраля 2012

См. этот вопрос : исключения BackgroundWorker не распространяются таким образом, поэтому вы не можете перехватить их в ThreadException.

BackgroundWorkers, которые генерируют исключения, вызывают RunWorkerCompleted какобычно, но задайте свойство Error для аргументов события.

1 голос
/ 22 февраля 2012

BackgroundWorker перехватывает исключение для вас (не будет отображаться в Application.ThreadException или AppDomain.UnhandledException) и передает исключение в аргумент события RunWorkerCompleted.Вы будете обрабатывать исключение в обработчике событий RunWorkerCompleted.

Существует RunWorkerCompletedEventArgs.Error, которую вы можете получить исключение после возникновения события RunWorkerCompleted.

    private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Error != null)
        { 
            // handle exception here
        }
    }
...