c# -如果Task抛出了一个异常,但是调用者的方法已经完成了,会发生什么?
本文关键字:方法 调用者 什么 Task 异常 一个 如果 | 更新日期: 2023-09-27 18:06:54
如果满足以下if
语句,并且Bar()
抛出异常,将会发生什么(以及为什么)?
async Task Foo()
{
Task<object> myTask = Bar();
if (condition)
{
return;
}
else
{
await myTask;
// ....
return;
}
}
异常会被捕获吗?由谁?
不,异常不会被捕获。您需要专门为Task
添加延续(请注意,当您为await
任务添加延续时,您正在向其添加延续)。
如果Bar
抛出异常,它将在您调用它的地方被抛出。
然而,如果Bar
返回的Task
包装了一个异常,会发生什么取决于你的。net运行时版本-对于。net 4.0,它会降低你的整个进程,因为它最终导致异常被抛出在终结器线程(或线程池线程)。对于。net 4.5+,异常将被静默处理。
在任何情况下,你都不想要。您应该始终显式处理任何可以在异步任务中传播的异步异常。如果您不想在代码的某个分支中await
任务(例如,您正在预加载认为需要的数据,但没有),则至少在任务上绑定延续以优雅地处理任何可能的异常。