【问题标题】:HttpClient - dealing with aggregate exceptionsHttpClient - 处理聚合异常
【发布时间】:2012-06-28 07:01:04
【问题描述】:

您好,我正在使用类似这样的 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 服务发出请求,并在请求中指定了无效参数,然后引发异常。我希望我能够捕获聚合异常并查看内部异常以找出请求失败的原因并返回友好消息。

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

【问题讨论】:

    标签: c# rest exception-handling httpclient aggregateexception


    【解决方案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之前检查任务faulted

    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);
    

    【讨论】:

    • 太好了,我会在下一个小时试试看!
    • 我知道这是一个老问题,但是有什么方法可以从聚合异常中获取 http 状态代码,就像捕获 web 异常时一样?
    • @gdp:是的,您可以在 AggregateException 上调用 .Flatten,然后访问 InnerExceptions 属性并提取其中包含的 WebException。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2014-05-17
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多