c# - HttpClient - 处理聚合异常

标签 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 block 只是为了尝试和单步抛出,但是没有任何断点被捕获在任何 catch block 中。我意识到使用 Task 异常可能发生在与调用者不同的线程上,因此异常被包装在一个聚合容器中,但我不确定处理这些异常的最佳方法是什么。

例如,我向 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在访问 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);

关于c# - HttpClient - 处理聚合异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11239537/

相关文章:

java - 将自定义数据映射存储为 ServletContext 中的属性?

java - 使用rest webservices打开数据库连接并从数据库获取数据

c# - 单体机器人 : Unhandled Exception Recovery

java - 何时在 Java 方法声明中使用 throws?

c# - DLLImport 找不到 DLL 文件

c# - JSON.NET:获取子值?

c# - Azure - 创建函数应用程序 - 至少一项资源部署操作失败

c# - 请求 UAC 提升 c#

java - 如何在java中使用REST/SOAP获取联邦 express 的跟踪详细信息?

java - Java异常层次结构背后的基本原理