【问题标题】:Background worker exception handling后台工作异常处理
【发布时间】:2013-12-14 10:41:29
【问题描述】:

我对如何处理异常有点困惑。

我有一个后台工作线程,它运行一些长时间运行的进程。我的理解是,如果后台工作线程发生异常,代码仍然会在 RunWorkerCompleted 方法结束。

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {

        if (e.Error != null)
           throw e.Error;

如果是这种情况,在 bgWorker.RunWorkerAsync(); 周围放置一个 try catch 块是否有任何意义?打电话,我猜不是?

我想重新抛出 RunWorkerCompleted 方法中捕获的异常,如何在不丢失堆栈跟踪的情况下执行此操作 - 我上面的内容是否正确?我读到您在重新抛出异常时应该只使用“throw”?

【问题讨论】:

    标签: c# multithreading backgroundworker


    【解决方案1】:

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

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

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

    注意 - 如果您不想创建新的异常类,可以使用现有的 ApplicationExceptionException。但它的信息量并不大,如果你要在某个地方捕捉到它,那么你将无法只捕捉到这个特定的异常

    【讨论】:

      【解决方案2】:

      试试这个

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

      【讨论】:

        【解决方案3】:

        如果是这种情况,放置 try catch 块是否有任何意义 围绕 bgWorker.RunWorkerAsync();打电话,我猜不是?

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

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

        【讨论】:

        • 所以在这种情况下,我不需要在我的 RunWorkerCompleted 方法中进行任何错误处理?还是更好的做法是处理 RunWorkerCompleted 方法中的任何错误?
        • 如果你在工作线程中处理异常,你将无法在 RunWorkerCompleted 中得到它,如果你不在 DoWork 中处理它,如果你做错了,你的应用程序可能会崩溃跨度>
        猜你喜欢
        • 2016-06-18
        • 1970-01-01
        • 1970-01-01
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        相关资源
        最近更新 更多