如何捕获C#中的异步void方法引发的异常?

在同步C#代码中,异常将在调用堆栈中传播,直到它们到达可以处理该异常的适当的catch块为止。但是,异步方法中的异常处理不是那么简单。

C#中的异步方法可以具有三种类型的返回值:void,Task和Task。当异步方法的返回类型为Task或Task发生异常时,该异常对象将包装在AggregateException的实例中并附加到Task对象。

如果抛出多个异常,则所有异常都存储在Task对象中。

例子1

static async Task Main(string[] args) {
   await DoSomething();
   Console.ReadLine();
}
public static async Task Foo() {
   throw new ArgumentNullException();
}
public static async Task DoSomething(){
   try{
      await Foo();
   }
   catch (ArgumentNullException ex){
      Console.WriteLine(ex);
   }
}

输出结果

System.ArgumentNullException: Value cannot be null.
at DemoApplication.Program.Foo() in C:\Users\Koushik\Desktop\Questions\ConsoleApp\Program.cs:line 37
at DemoApplication.Program.DoSomething() in C:\Users\Koushik\Desktop\Questions\ConsoleApp\Program.cs:line 44