Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中捕获等待的异步方法的异常?_C#_.net_Asynchronous_Exception Handling_Async Await - Fatal编程技术网

如何在C#中捕获等待的异步方法的异常?

如何在C#中捕获等待的异步方法的异常?,c#,.net,asynchronous,exception-handling,async-await,C#,.net,Asynchronous,Exception Handling,Async Await,我基本上在想,在C#中,我应该如何捕获通过await关键字等待的异步方法的异常。例如,考虑下面的小控制台程序,其中最重要的是包含一个名为 AwaitSync 的方法。code>waitsync调用TestAsync,它返回一个任务,该任务在执行时引发异常。我试图在awaitsync中捕获异常,但它没有得到处理 如何从TestAsync返回的任务捕获异常?虽然这个示例是一个控制台程序,但我的实际问题是在ASP.NET MVC/Web API的上下文中 编辑: 结果发现异常被捕获,出于技术原因,我只

我基本上在想,在C#中,我应该如何捕获通过
await
关键字等待的异步方法的异常。例如,考虑下面的小控制台程序,其中最重要的是包含一个名为<代码> AwaitSync <代码>的方法。code>waitsync调用
TestAsync
,它返回一个任务,该任务在执行时引发异常。我试图在
awaitsync
中捕获异常,但它没有得到处理

如何从
TestAsync
返回的任务捕获异常?虽然这个示例是一个控制台程序,但我的实际问题是在ASP.NET MVC/Web API的上下文中

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

await
表达式生成的代码将调用
GetResult()
,调用
TaskAwaiter
上与
TestAsync
返回的
任务相关联的
Task

GetResult
将注意到任务出现故障,从任务内的
aggregateeexception
中获取第一个异常,然后抛出该异常

最终的结果是catch块将捕获任务中抛出的异常-但是如果您等待一个有多个异常的任务,除非您采取特殊的操作,否则您只能看到第一个异常(有多种方法可以实现)


当您声称异常实际上未经处理时,您的代码中似乎有一些内容与您显示的内容不同,因为您提供的代码肯定会工作,并且对我也有作用。

您是说这不起作用吗?当我运行您的代码时,我看到“异常捕获”。我不会捕获它。我会再检查一次。@jishi看到我编辑的问题,它终究会被发现。@spender你是对的,在我的案例中,由于技术原因,它没有被注意到。谢谢,午餐后会详细说明。事实证明,异常确实被发现了,但在我按键结束程序之前,确认消息并没有写入控制台。因此,一开始我没有注意到消息被打印出来。猜测异步需要一些时间来适应:)非常感谢您解释如何使用wait处理异常,这对我的理解非常有用。
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"); });
    }
}