嗨,我正在使用类似于以下的HttpClient:
public static Task<string> 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; } }
但是我在处理例外时遇到困难.我添加了额外的catch块,只是尝试和一步一步抛出,但是没有一个断点被捕获在任何catch块中.我意识到使用任务,异常可能发生在与调用者不同的线程上,因此异常被包装在聚合容器中,但我不知道处理这些异常的最佳方法是什么.
例如,我在请求中向Web服务发出请求并指定一个无效参数,并抛出异常.我想让我能够捕获总体异常,并查看内在异想法,找出请求失败的原因,并返回友好的消息.
所以我的问题是,捕获这些总体异常并处理它们的最佳方式是什么?
解决方法
task.Result
抛出例外:
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; } });
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);