捕获线程未处理的异常

6

你们中有没有人知道如何在应用程序的主线程中捕获特定线程抛出的异常?

例如,我有一个非常简单的线程执行一些基本操作:

 try
        {
            Thread t = new Thread(new ThreadStart(Cache.initialize));
            t.Start();
            t.Name = "loading";
            while (t.IsAlive)
            {
                progressBar1.PerformStep();
             }
        }

        catch (PropertyOrFieldNotInitializedException ex)
        {
            Console.WriteLine(ex.StackTrace);
            MessageBox.Show("L'application ne peut se connecter au serveur, vérifiez votre connexion");
        }

问题在于这个捕获是无用的,因为异常不会在主堆栈中被检索到。
    public static void initialize()
        {
            try
            {
                ctxMdv = new ClientContext(Configuration.getInstance().UrlMdv);
                ...                
            }

            catch (PropertyOrFieldNotInitializedException e) //si le serveur n'est pas démarré
{
                throw ;
            }

在这里,所有的操作都会在“throw”处停止,并且不会处理任何内容,即使在主堆栈中尝试通过显示消息框来捕获它。

那么,我如何捕捉从我的线程抛出的PropertyOrFieldNotInitializedException异常呢?

您是否有一些在C#中从线程中捕获异常的最佳实践?

非常感谢!

附言:好的,多亏了下面Thorsten Dittmar的答案,我可以这样做:

这是主线程

 BackgroundWorker bw = new BackgroundWorker();
        bw.WorkerReportsProgress = true;
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        bw.RunWorkerAsync();

这是我的工作:

private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        Cache.initialize(); // the thread job
    }

这是我的完成事件,即使抛出异常也会发生:

 private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      if (!(e.Error == null))

            if (e.Error is WebException)
                Console.WriteLine(e.Error.StackTrace);
            MessageBox.Show("L'application ne peut se connecter au serveur, vérifiez votre connexion");

         this.Dispose();
         Application.Exit();
    }

我计划处理ProgressChanged委托来修正进度条... ;) 谢谢!

1个回答

4

嗯,一种方法是在您的情况下使用BackgroundWorker而不是线程。您不需要在那里使用try块,因为错误将自动捕获并传递给当工作程序结束时分配的处理程序。

编辑:
您还可以使用BackgroundWorker的事件向您的表单报告进度,以便您可以正确更新进度条;-)


好的!它正在工作!非常感谢你!我会编辑我的帖子,将解决方案代码发布出来,感谢你。 - KitAndKat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接