【问题标题】:Catch error in Application.ThreadException from another thread从另一个线程捕获 Application.ThreadException 中的错误
【发布时间】:2012-02-22 14:00:43
【问题描述】:

我有一个来自应用程序的窗口,其 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 中构建。

请帮忙。提前致谢。

【问题讨论】:

标签: c# multithreading .net-4.0 backgroundworker


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    BackgroundWorker 为您捕获异常(不会暴露给 Application.ThreadException 或 AppDomain.UnhandledException)并将异常传递给 RunWorkerCompleted 事件的参数。您将在 RunWorkerCompleted 事件处理程序上处理异常。

    一旦触发 RunWorkerCompleted 事件,就会出现 RunWorkerCompletedEventArgs.Error 异常。

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

    【讨论】:

      猜你喜欢
      • 2010-09-16
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      相关资源
      最近更新 更多