繁体   English   中英

后台工作者异常处理

[英]Background worker exception handling

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

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

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {

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

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

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

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

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

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

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

试试这个

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事件处理程序中出现未处理的异常的位置中断。 所以你可以做这样的事情

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



        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM