我正在用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
{
...
}
}
它有效,但......它感觉正确。
答案 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>
操作返回的 - 所以您需要小心。