我基本上想知道在 C# 中我应该如何捕获通过等待的异步方法的异常await
关键词。例如,考虑以下小控制台程序,其中最重要的是包含一个名为AwaitSync
. AwaitSync
calls TestAsync
,它返回一个任务,执行时会抛出异常。我尝试捕获异常AwaitAsync
, 但它没有得到处理.
class Program
{
static void Main(string[] args)
{
AwaitAsync();
Console.ReadKey();
}
static async Task AwaitAsync()
{
try
{
await TestAsync();
}
catch (Exception)
{
Console.WriteLine("Exception caught");
}
}
static Task TestAsync()
{
return Task.Factory.StartNew(() => { throw new Exception("Test"); });
}
}
我应该如何从返回的任务中捕获异常TestAsync
?虽然这个示例是一个控制台程序,但我现实生活中的问题是在 ASP.NET MVC / Web API 的上下文中。
EDIT:事实证明,异常被捕获了,由于技术原因,我只是在终端关闭之前没有注意到“异常捕获”消息。无论如何,乔恩·斯基特的回答对我的理解非常有价值await
和异常处理。
生成的代码为await
表达式将调用GetResult()
on the TaskAwaiter
与相关的Task
由返回TestAsync
.
GetResult
会注意到任务出错了,获取first例外AggregateException
在任务中,然后扔掉它。
最终结果是您的 catch 块将捕获您的任务中抛出的异常 - 但是如果您等待一个具有multiple例外情况,除非您采取特殊操作(有多种方法),否则您只会看到第一个。
当您声称异常实际上未得到处理时,您的代码中似乎除了您所显示的内容之外还有其他内容 - 因为您给出的代码肯定应该有效,并且对我来说也是如此。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)