如何在BackgroundWorker.RunWorkerCompleted事件处理程序中区分不同的异常类型

时间:2010-10-07 12:10:08

标签: c# .net exception exception-handling backgroundworker

我正在用C#做一个小小的爱好项目,这是一种我不太了解的语言,并且偶然发现了以下内容:

假设您使用BackgroundWorker实现了异步操作。现在,如果存在异常,将引发事件RunWorkerCompleted,并且RunWorkerCompletedEventArgs.Error将为非null。

以下是规范的方式来处理不同的异常类型吗? (这里所有异常种类都是兄弟姐妹WRT继承)

if (e.Error != null)
{
    FirstKindOfException e1 = e as OneKindOfException;
    SecondKindOfException e2 = e as SecondKindOfException;
    ...
    LastKindOfException en = e as LastKindOfException;
    if (e1 != null)
    {
        ...
    }
    else if (e2 != null)
    {
        ...
    }
    ...
    else
    {
        ...
    }
}

它有效,但......它感觉正确

4 个答案:

答案 0 :(得分:7)

您可以使用is来保持每个测试的范围:

if (e.Error is FirstKindOfException )
{
    ...
}
else if (e.Error is SecondKindOfException)
{
    ...
}

(如果你想要异常中的特殊值,则重新投射)

说实话,我很少需要处理不同类型异常的批次。在大多数情况下,只需恢复(补偿)已知状态并适当地报告错误即可。通常我更喜欢在开始操作之前测试可能的错误,所以异常确实是特殊的。

答案 1 :(得分:5)

使用运算符:

if (e.Error is FirstKindOfException) {
   //...
}
else if (e.Error is SecondKindOfException) {
   //...
}
//etc..

或者只是缩短它,因为你不知道如何处理这些异常。如果你这样做,那么你会在DoWork()事件处理程序中捕获它们,在状态蒸发后尝试处理它们没有意义:

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

答案 2 :(得分:2)

使用is运算符可能吗?

if (e is OneKindOfException)
{
}
else if (e is SecondKindOfException)
{
}

答案 3 :(得分:1)

是的,您可以这样做,但实际上取决于您将如何处理所有这些异常类型。通常这只会向用户显示,因此无需检查错误类型。

另外,您需要记住,异常的类型可能是AggregateException - 这是从Task<T>操作返回的 - 所以您需要小心。