You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# HttpClient捕获异常时e.Message仅输出错误码无报错信息如何解决

C# HttpClient调用接口无法获取错误响应详情问题解答

成因

  • HttpResponseMessage.EnsureSuccessStatusCode()方法的触发逻辑是:只要响应HTTP状态码不在200-299区间,就会直接抛出HttpRequestException,该异常的默认Message属性仅包含状态码和HTTP标准原因短语,不会主动读取响应体内容。
  • 接口返回的自定义错误描述通常存储在响应报文体(Body)中,原有代码触发异常后直接进入catch块,未执行response.Content.ReadAsStringAsync()的逻辑,因此无法拿到自定义错误信息。
  • Postman的逻辑是无论响应状态码是否为成功类,都会完整读取并展示响应头、响应体所有内容,因此可以看到完整错误信息。

解决方法

推荐的修改方案是:先判断响应状态码,无论成功失败都优先读取响应内容,再做后续处理,示例代码如下:

// HttpClient全局单例的定义保持不变
static readonly HttpClient client = new HttpClient();

static async Task APITest()
{
    HttpResponseMessage response = null;
    try   
    {
        response = await client.GetAsync("替换为你的接口地址");
        // 先读取响应体内容,不管成功失败都能拿到返回信息
        string responseBody = await response.Content.ReadAsStringAsync();
        // 再判断状态码是否为成功类
        if (response.IsSuccessStatusCode)
        {
            Debug.Log("请求成功:" + responseBody);
        }
        else
        {
            Debug.Log($"请求错误,状态码:{(int)response.StatusCode},错误详情:{responseBody}");
        }
    }
    catch(Exception e)
    {
        // 这里捕获的是网络不通、超时等请求层面的异常,不是接口返回的业务错误
        Debug.Log("\n请求异常捕获!");  
        Debug.Log("异常信息:{0} ",e.Message);
        // .NET Core 3.0及以上版本可以从HttpRequestException中额外获取状态码
        if (e is HttpRequestException httpEx)
        {
            Debug.Log($"对应错误状态码:{(int)httpEx.StatusCode}");
        }
    }
}

如果一定要保留EnsureSuccessStatusCode()的写法,也可以捕获异常后从预先存储的response对象中读取响应体,但不推荐该做法,因为异常场景下响应流可能已被释放,读取成功率较低。

内容的提问来源于stack exchange,提问作者Mohan Reddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:06:03