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

如何从aiohttp的ClientError异常中获取服务端返回的响应内容

解答

可以在异常捕获代码块中获取到服务端返回的响应内容。

当你设置raise_for_status=True时,服务端返回4xx/5xx状态码触发的异常是aiohttp.ClientResponseError,它属于ClientError的子类,该异常实例会内置response属性,对应服务端返回的完整响应对象。


注意事项

  • 只有HTTP状态码异常对应的ClientResponseError才携带response属性,连接超时、DNS解析失败、断网这类非HTTP状态类的ClientError子类没有该属性,使用前需要先判断属性是否存在,避免抛出属性不存在的错误。
  • 响应内容的读取逻辑和正常请求拿到的response对象完全一致,.text()、.json()、.read()都是异步方法,调用时需要加await。

正确示例代码

写法1:分异常类型捕获(逻辑更清晰)

import asyncio
import aiohttp
from aiohttp import ClientError, ClientResponseError

async def request():
    try:
        async with aiohttp.ClientSession() as session:
            response = await session.get('http://127.0.0.1:5000/auth/user', raise_for_status=True)
    except ClientResponseError as e:
        # 仅HTTP状态码错误会进入该分支,可直接读取response
        if e.response:
            # 根据返回内容格式选择读取方法,这里以JSON为例
            err_info = await e.response.json()
            print(f"错误状态码:{e.status}, 错误详情:{err_info}")
    except ClientError as e:
        # 其他非HTTP状态类请求错误进入该分支,无response
        print(f"请求失败:{str(e)}")

asyncio.run(request())

写法2:统一捕获判断(代码更简洁)

import asyncio
import aiohttp
from aiohttp import ClientError

async def request():
    try:
        async with aiohttp.ClientSession() as session:
            response = await session.get('http://127.0.0.1:5000/auth/user', raise_for_status=True)
    except ClientError as e:
        # 先判断是否存在response属性
        if hasattr(e, 'response'):
            err_text = await e.response.text()
            print(f"服务端返回错误:{e.status}, 响应内容:{err_text}")
        else:
            print(f"请求失败:{str(e)}")

asyncio.run(request())

内容的提问来源于stack exchange,提问作者Cyril N.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:06:07