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 对象。这个后台工作人员负责完成应用程序的大部分工作,如果 doWork 方法出现异常,它不会像我预期的那样被传播。这是我在 MainForm 中使用的后台工作人员的代码。

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

请告知我在这里做错了什么,我希望程序中任何地方生成的异常都被捕获到上面的那些全局处理程序中,以便报告错误/异常以进行修复..

谢谢,

4

1 回答 1

7

这是设计使然,BackgroundWorker 类捕获在 DoWork 事件处理程序中引发的任何异常。并在 RunWorkerCompleted 事件处理程序的 e.Error 属性中公开它。所以这样写:

  private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
  { 
      if (e.Error != null) throw e.Error;
      // etc..
  }
于 2012-05-05T15:55:09.450 回答