如果满足以下if
语句并且Bar()
抛出异常会发生什么(以及为什么)?
async Task Foo()
{
Task<object> myTask = Bar();
if (condition)
{
return;
}
else
{
await myTask;
// ....
return;
}
}
是否会发现异常?由谁?
答案 0 :(得分:5)
不,这个例外不会被抓住。您需要专门为Task
添加续集(请注意,当您await
任务时,您需要为其添加续集。
答案 1 :(得分:4)
如果Bar
抛出异常,它将在您调用它时被抛出。
但是,如果Task
返回包含异常的Bar
,会发生什么取决于您的.NET运行时版本 - 对于.NET 4.0,它会降低整个过程,因为它最终会导致在终结器线程(或线程池线程)上抛出异常。对于.NET 4.5+,异常将被静默处理。
无论如何,你也不想要。您应该始终显式处理可以在异步任务中传播的任何异步异常。如果您不想在代码的某个分支中await
执行该任务(例如,您预先加载了认为您需要的数据,但是,不要在任务上绑定一个延续,以优雅地处理任何可能的异常。