加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – HttpClient – 处理聚合异常

发布时间:2020-12-15 06:24:29 所属栏目:百科 来源:网络整理
导读:嗨,我正在使用类似于以下的HttpClient: public static Taskstring AsyncStringRequest(string url,string contentType){ try { var client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQuality
嗨,我正在使用类似于以下的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;
    }
});

更好:检查faulted之前的任务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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读