HttpClient的 - 处理例外汇总(HttpClient - dealing with agg

2019-07-30 03:31发布

嗨,我使用的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服务和具体的参数无效的请求,并抛出一个异常。 我希望我能够赶上总异常,并期待在innerexceptions工作为什么请求失败,并返回一个友好的信息。

所以我的问题是,什么是捕获这些骨料异常和处理这些问题的最佳途径?

Answer 1:

唯一的例外是抛出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;
    }
});

更好:检查任务故障访问之前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);


文章来源: HttpClient - dealing with aggregate exceptions