如何从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.
相关产品推荐
相关产品推荐

