C#中未处理的异常未被捕获

4
我正在使用以下代码处理程序中的所有未处理异常。但问题在于异常没有传播到指定的方法。
 [STAThread]
    static void Main()
    {


        AppDomain currentDomain = default(AppDomain);
        currentDomain = AppDomain.CurrentDomain;
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
        // Handler for unhandled exceptions.
        currentDomain.UnhandledException += GlobalUnhandledExceptionHandler;
        // Handler for exceptions in threads behind forms.
        System.Windows.Forms.Application.ThreadException += GlobalThreadExceptionHandler;


        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new FormMain());
    }

  private static void GlobalUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e)
    {
        Exception ex = (Exception)e.ExceptionObject;        

        MessageBox.Show(ex.Message,
                                  "Important",
                                  MessageBoxButtons.YesNo);
    }

    private static void GlobalThreadExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
        Exception ex = e.Exception;

        MessageBox.Show(ex.Message,
                                 "Important",
                                 MessageBoxButtons.YesNo);

    }

FormMain有一个backgroundWorker对象。这个backgroundworker是应用程序的主要部分,如果doWork方法中出现异常,它不会按照我期望的那样传播..以下是我在MainForm中使用的backgroundworker的代码。

 private void button_startSync_Click(object sender, EventArgs e)
 {            
     backgroundWorker1.RunWorkerAsync(getSettings());\          
 }

  private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  {        

     // ... processing code
     // Unhandled Exception will generated in this method...           
  }

请指导我在这里做错了什么,我希望我的程序中任何地方生成的异常都能被捕获到上面的全局处理程序中,以便将错误/异常报告回来进行修复。
谢谢。
1个回答

7
这是按设计实现的,BackgroundWorker 类捕获在 DoWork 事件处理程序内抛出的所有异常,并在 RunWorkerCompleted 事件处理程序中将其暴露在 e.Error 属性中。因此,请按照以下方式编写代码:
  private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
  { 
      if (e.Error != null) throw e.Error;
      // etc..
  }

1
我认为你的意思是在WorkedCompleted中完成这个操作。DoWorkEventArgs没有Error属性。 - Ahmed

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