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)
它有效,但......感觉不对.
你可以is用来保持每个测试的范围:
if (e.Error is FirstKindOfException )
{
...
}
else if (e.Error is SecondKindOfException)
{
...
}
Run Code Online (Sandbox Code Playgroud)
(如果你想要异常中的特殊值,则重新强制转换)
说实话,我很少需要处理许多不同类型的异常.在大多数情况下,只需恢复(补偿)已知状态并适当地报告错误即可.通常我更喜欢在开始操作之前测试可能的错误,所以异常真的是特殊的.
使用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)
| 归档时间: |
|
| 查看次数: |
533 次 |
| 最近记录: |