如何捕获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