来自另一个线程的Application.ThreadException中的Catch错误

时间:2012-02-22 05:43:01

标签: c# multithreading .net-4.0 backgroundworker

我有一个来自应用程序的窗口,其中包含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#,框架4中,在VS2010 Pro中构建。

请帮忙。提前谢谢。

2 个答案:

答案 0 :(得分:4)

请参阅this question:BackgroundWorker异常不会像那样传播,因此您无法在ThreadException中捕获它们。

抛出异常的BackgroundWorkers像往常一样调用RunWorkerCompleted,但在事件参数上设置Error属性。

答案 1 :(得分:1)

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
        }
    }