c# – HttpClient – 处理聚合异常

前端之家收集整理的这篇文章主要介绍了c# – HttpClient – 处理聚合异常前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
嗨,我正在使用类似于以下的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);
原文链接:https://www.f2er.com/csharp/95701.html

猜你在找的C#相关文章