BackgroundWorker捕获错误

时间:2013-11-08 20:08:15

标签: c# exception-handling

我一直在尝试关注此MSDN example,并使用以下代码。但是,即使在SomeMethod()中发生错误,e.Error在RunWorkerCompleted中始终为null;

private void WorkerDoWork(object sender, DoWorkEventArgs e)
{
   getMethod = SomeMethod();
}

private void Worker_RunWorkerCompleted(object sender,
                                             RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
    {
        var result = ModernDialog.ShowMessage("Error occurred.... " +
                                   e.Result, "ErrorTitle", MessageBoxButton.OK);
    }
    else if (e.Cancelled)
    {

    }
    Else
    {

    }
}

谁能看到我做错了什么?

我可以通过执行以下操作来解决这个问题,但我真的不明白为什么MSDN中的示例对我不起作用?

private void WorkerDoWork(object sender, DoWorkEventArgs e)
{
    try
    {
        getMethod = SomeMethod();
    }
    catch(Exception ex)
    {
        e.Result = ex;
    }
}

private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{

    if (e.Result is Exception)
    {
            var result = ModernDialog.ShowMessage("Error occurred.... " + e.Result, "ErrorTitle", MessageBoxButton.OK);
    }

    //etc
}

另外,使用第二种方法我无法从e.Result访问.Message。例如,在WorkerDoWork中,我可以使用ex.Message

编辑:我已经设置了工作者来创建它自己的错误,我仍然得到e.Error == null。显示的变量有点模糊,因为CTRL + PrtSc使其淡入淡出 enter image description here

1 个答案:

答案 0 :(得分:3)

我认为问题是emailWorkerDoWork()中的空异常块。如果结果是异常,则无法捕获后台工作程序中的异常。

所以这样的事情会给你想要的结果:

private void emailWorkerDoWork(object sender, DoWorkEventArgs e)
{
    int value = 1 / int.Parse("0");
}

我发现另一个SO答案证实了我的怀疑,并提供了MSFT参考here