【发布时间】:2014-07-11 02:35:25
【问题描述】:
如果你有以下方法:
public async Task<string> GetTAsync(url)
{
return await httpClient.GetStringAsync(url);
}
public async Task<List<string>> Get(){
var task1 = GetTAsync(url1);
var task2 = GetTAsync(url2);
await Task.WhenAll(new Task[]{task1, task2});
// but this may through if any of the tasks fail.
//process both result
}
如何处理异常?我查看了 HttpClient.GetStringAsync(url) 方法的文档,它可能抛出的唯一异常似乎是 ArgumentNullException。但至少我遇到了一次禁止的错误,并且想处理所有可能的异常。但我找不到任何具体的例外。我应该在这里捕获异常异常吗?如果它更具体,我将不胜感激。 请帮忙,这真的很重要。
【问题讨论】:
-
捕获
Exception,然后检查是否为AggregateException类型。如果是这样,AggregateException.InnerExceptions使您可以访问可能由单个任务引发的异常。注意AggregateException可以嵌套,您可以使用AggregateException.Flatten来说明这一点。或者,在await Task.WhenAll之后,您可以只访问task.Result或对单个任务执行await task,它将重新抛出任务的异常。相关:stackoverflow.com/q/24623120/1768303. -
是的,我可以捕获聚合异常并将其展平,但我想要的是 httpclient.GetStringAsync() 方法可能抛出的特定异常。在查看其他帖子时,有人写道 HttpRequestException 是将抛出的异常。到目前为止,我无法确认。
-
你自己试试看吧?您将收到带有相关错误信息的
System.Net.Http.HttpRequestException,例如“响应状态码不表示成功:404(未找到)。”请记住,像404这样的状态会为HttpClient.GetStringAsync抛出错误,但不会为HttpClient.GetAsync抛出错误。 -
我试过但没有得到 HttpRequestException 或 Aggregate 异常。但是我得到了 InvalidOperationException。我不知道这是否是您收到 404 或 403 错误时的预期结果。
-
当我使用无效的 URL 调用
GetStringAsync时,我得到了HttpRequestException。如果没有看到调用GetStringAsync的实际代码并且可以访问URL,很难说出为什么你会得到InvalidOperationException。使用 Fiddler 监视 HTTP 数据包。
标签: c# exception-handling async-await httpclient