后台工作者exception处理

我对如何处理exception感到有些困惑。

我有一个后台工作线程,运行一些长时间运行的进程。 我的理解是,如果后台工作线程发生exception,代码仍将以RunWorkerCompleted方法结束。

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) throw e.Error; 

如果是这种情况,那么在bgWorker.RunWorkerAsync()周围放置一个try catch块是有意义的。 打电话,我猜不是吗?

我想重新抛出RunWorkerCompleted方法中捕获的exception,如何在不丢失堆栈跟踪的情况下执行此操作 – 我的上述内容是否正确? 我读过你,当你重新抛出exception时,你应该只使用“抛出”?

我建议你创建一些特定于业务的exception,它描述了你在后台进行的操作。 并将此exception作为内部exception抛出原始exception:

 private void bgWorker_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) throw new BusinessSpecificException("Operation failed", e.Error); // ... } 

因此,其堆栈跟踪的原始exception将可用,并且您将抛出更多描述性exception。

注 – 如果您不想创建新的exception类,则可以使用现有的ApplicationException或Exception 。 但它不是那么有用,如果你要在某个地方捕捉它,那么你将无法仅捕获这个特殊的例外

试试这个

 void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) throw new Exception("My Custom Error Message", e.Error); 

如果是这种情况,那么在bgWorker.RunWorkerAsync()周围放置一个try catch块是有意义的。 打电话,我猜不是吗?

不,你不能这样做因为bgWorker.RunWorkerAsync(); 这是一种方法(不是an event )。 如果您在Visual Studio调试器下运行,调试器将在DoWork事件处理程序中的位置处中断,其中引发了未处理的exception。 所以你可以做这样的事情

  private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { try { //put your break point here // here you can capture your exception } catch (Exception ex) { // here catch your exception and decide what to do throw; } }