2012-05-04 80 views
2

我想处理在RunWorkerCompleted处理程序中的DoWork处理程序中发生的异常,但是当代码在调试程序下运行时,我首先遇到另一个异常“用户代码未执行处理”。如何处理从BackgroundWorker的DoWork处理程序抛出的异常?

的代码下面简短的例子我使用的是:

BackgroundWorker _worker; 
public void Test() 
{ 
    _worker = new BackgroundWorker(); 
    _worker.WorkerReportsProgress = false; 
    _worker.WorkerSupportsCancellation = false; 

    _worker.DoWork += new DoWorkEventHandler(bw_DoWork); 
    _worker.RunWorkerCompleted += new 
     RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
    _worker.RunWorkerAsync(); 
} 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    e.Result = ActuallWorkHere(); 
} 

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    var t = e.Error; 
} 

private IEnumerable<string> ActuallWorkHere() 
{ 
    throw new Exception("test"); 
    // "Exeption was unhandled by user code" if called 
    string[] res = { "test" }; 
    return res; 
} 

我在做什么错?

+1

您究竟在哪里得到异常?我没有看到你的代码中的一个尝试抓住! – banging

+1

“exeptiong first”应为“首次机会例外”。这很正常,调用DoWork的代码抓住了这个例外。在RunWorkerCompleted中你应该用它来做什么取决于你。例如,你可以写'if(e.Error!= null)throw e.Error;'。 –

回答

4

你不是真的做错什么,这是Visual Studio中确实有未处理的错误,当运行在调试器代码:MSDN上

BackgroundWorker.DoWork Event

如果你正在运行Visual Studio调试器,调试器将在发生未处理的 异常的DoWork事件处理程序中的点处中断。

尝试运行您编译的程序,你不会看到这个。

请注意,您可以在DoWork中处理此异常,并且RunWorkerCompleted处理程序中的RunWorkerCompletedEventArgs.Error属性仍会存储您的错误的详细信息。

相关问题