gdp*_*gdp 12 c# rest exception-handling httpclient aggregateexception
您好我正在使用类似这样的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;
}
}
Run Code Online (Sandbox Code Playgroud)
但我处理异常时遇到困难.我添加了额外的catch块只是为了尝试并逐步抛出,但没有任何断点被捕获到任何catch块中.我意识到使用Task,异常可能发生在与调用者不同的线程上,因此异常包含在聚合容器中,但我不确定处理这些异常的最佳方法是什么.
例如,我向Web服务发出请求,并在请求中指定了特定的无效参数,并抛出异常.我希望我能够捕获聚合异常,并查看innerexceptions以找出请求失败的原因并返回友好消息.
所以我的问题是,捕获这些聚合异常并处理它们的最佳方法是什么?
dtb*_*dtb 19
抛出异常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;
}
});
Run Code Online (Sandbox Code Playgroud)
更好:在访问之前检查任务是否出现故障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;
}
});
Run Code Online (Sandbox Code Playgroud)
如果你实际上没有做某事ContinueWith,你可以简单地省略它:
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(...);
return client.GetStringAsync(url);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24762 次 |
| 最近记录: |