HttpClient - 处理聚合异常

时间:2012-06-28 07:01:05

标签: 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;
    }
}

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

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

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

1 个答案:

答案 0 :(得分: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;
    }
});

更好:在访问faulted之前检查任务是否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);