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

Lau*_*nis 4 .net c# exception-handling exception 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
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

它有效,但......感觉不对.

Mar*_*ell 7

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

if (e.Error is FirstKindOfException )
{
    ...
}
else if (e.Error is SecondKindOfException)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

(如果你想要异常中的特殊值,则重新强制转换)

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


Han*_*ant 5

使用is运算符:

if (e.Error is FirstKindOfException) {
   //...
}
else if (e.Error is SecondKindOfException) {
   //...
}
//etc..
Run Code Online (Sandbox Code Playgroud)

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

if (e.Error != null) throw new BackgroundTaskFailedException(e.Error);
Run Code Online (Sandbox Code Playgroud)

  • @Aliostad:重点是不要捕捉你不知道如何处理的异常.Perf真的没关系,程序会慢几毫秒就会崩溃.如果异常是可恢复的,那么它应该在DoWork()中得到处理. (3认同)