为什么我的 try/catch 块没有捕获 System.AggregateException?

Why isn't my try/catch block catching System.AggregateException?

我有一些代码可以像这样进行异步 http 调用:

try
{
  var myHttpClient = new HttpClient();
  var uri = "http://myendpoint.com";

  HttpResponseMessage response = client.GetAsync(uri).Result;
}
catch (Exception ex)
{
  Console.WriteLine("an error occurred");
}

大多数情况下这工作正常,但偶尔我会得到一个 System.AggregateException,上面写着 One or more errors occurred. ---> System.AggregateException: One or more errors occurred. ---> System.Threading.Tasks.TaskCanceledException: A task was canceled. --- End of inner exception stack trace

我的 catch 语句在上述情况下从未达到,我不确定为什么。我知道 Tasks 在抛出异常时有一些复杂的因素,但我不知道如何在我的 catch 语句中处理它们?

异常不是在您的 try/catch 的同一个线程中抛出的。这就是为什么你的 catch 块没有被执行。

勾选this article about HttpClient:

try
{
    HttpResponseMessage response = await client.GetAsync("api/products/1");
    response.EnsureSuccessStatusCode();    // Throw if not a success code.

    // ...
}
catch (HttpRequestException e)
{
    // Handle exception.
}