HttpClient – 处理聚合exception

嗨我正在使用类似这样的HttpClient:

public static Task AsyncStringRequest(string url, string contentType) { try { var client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue(contentType)); return client.GetStringAsync(url).ContinueWith(task => { return task.Result; }); } catch (AggregateException ex) { throw ex; } catch (WebException ex) { throw ex; } catch (Exception ex) { throw ex; } } 

但我在处理exception时遇到困难。 我添加了额外的catch块只是为了尝试并逐步抛出,但没有任何断点被捕获到任何catch块中。 我意识到使用Task,exception可能发生在与调用者不同的线程上,因此exception包含在聚合容器中,但我不确定处理这些exception的最佳方法是什么。

例如,我向Web服务发出请求,并在请求中指定了特定的无效参数,并抛出exception。 我希望我能够捕获聚合exception,并查看innerexceptions以找出请求失败的原因并返回友好消息。

所以我的问题是,捕获这些聚合exception并处理它们的最佳方法是什么?

task.Result抛出exception:

 var client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add(...); return client.GetStringAsync(url).ContinueWith(task => { try { return task.Result; } catch (AggregateException ex) { throw ex; } catch (WebException ex) { throw ex; } catch (Exception ex) { throw ex; } }); 

更好:在访问task.Result之前检查任务是否出现故障 :

 var client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add(...); return client.GetStringAsync(url).ContinueWith(task => { if (task.IsFaulted) { var ex = task.Exception; } else if (task.IsCancelled) { } else { return task.Result; } }); 

如果你实际上没有在ContinueWith做某事,你可以简单地省略它:

 var client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add(...); return client.GetStringAsync(url);