as7*_*s74 12 .net c# try-catch async-await
尝试捕捉外面:await Task.Run(() =>有意义或只是在等待中使用它们?
private async void Test()
{
try
{
await Task.Run(() =>
{
try
{
DoingSomething();
}
catch (Exception ex)
{
log.Error(ex.Message);
}
});
}
catch (Exception ex)
{
log.Error(ex.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
YK1*_*YK1 13
如果您Exception在委托内部处理(在您的情况下只是为了记录目的),await在正常情况下不会引发异常.这应该没问题.
private async Task Test()
{
await Task.Run(() =>
{
try
{
DoingSomething();
}
catch (Exception ex)
{
log.Error(ex.Message);
}
});
}
Run Code Online (Sandbox Code Playgroud)
但是,因为你是await荷兰国际集团的Task,最可能的是,会有一些DoSomethingElse的 Test方法,它可能会通过对结果的影响Task-在这种情况下,它也是情理之中的有try/catch各地await.
private async Task Test()
{
try
{
await Task.Run(() =>
{
try
{
DoingSomething();
}
catch (SomeSpecialException spex)
{
// it is OK to have this exception
log.Error(ex.Message);
}
});
DoSomethingElse(); // does not run when unexpected exception occurs.
}
catch (Exception ex)
{
// Here we are also running on captured SynchronizationContext
// So, can update UI to show error ....
}
}
Run Code Online (Sandbox Code Playgroud)
如果您传递给委托Task.Run抛出一个异常,那么你就可以抓住它的外面Task.Run,当你await返回的任务.
你不应该认为await它是一块.没有"在等待中"之类的东西.相反,await可以将其视为一个带有单个参数的运算符(在本例中为Task返回的Task.Run).Task.Run将从其委托中捕获异常并将它们放在返回的Task; await然后将传播该异常.
| 归档时间: |
|
| 查看次数: |
18622 次 |
| 最近记录: |