5

我基本上想知道在 C# 中我应该如何从通过await关键字等待的异步方法中捕获异常。例如,考虑以下小型控制台程序,其中最重要的是包含一个名为AwaitSync. AwaitSynccalls TestAsync,它返回一个 Task ,执行时会引发异常。我试图在 中捕获异常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 的上下文中。

编辑: 结果异常被捕获,出于技术原因,我只是在终端关闭之前没有注意到“异常捕获”消息。无论如何,Jon Skeet 的回答对我理解await和异常处理非常有价值。

4

1 回答 1

10

await为表达式生成的代码将调用与返回GetResult()TaskAwaiter相关联的.TaskTestAsync

GetResult会注意到任务出错,从任务中获取第一个异常AggregateException,然后抛出它。

最终结果是您的 catch 块将捕获您的任务中引发的异常 - 但如果您等待具有多个异常的任务,除非您采取特殊操作,否则您只会看到第一个异常(有多种方法)。

当您声称该异常实际上没有得到处理时,您的代码中似乎除了您所显示的内容之外还有其他内容 - 因为您提供的代码当然应该有效,并且对我有用。

于 2012-11-07T09:51:48.003 回答