CentOS7.4下requests 2.26.0无法捕获无效JSON异常如何解决?
问题原因
- 你传入的
json={ '' }本身不是合法的字典参数:Python中{ '' }是集合(set)类型,不是键值对结构的字典,JSON标准本身不支持集合类型,序列化时会抛出Python标准库的TypeError,不属于requests自定义的异常范畴,自然不会被requests.exceptions.RequestException捕获。 - 你使用的requests 2.26.0版本不存在
requests.exceptions.InvalidJSONError这个异常类:该异常是requests v2.27.0版本才新增的,专门用于捕获响应内容的JSON反序列化错误,哪怕你升级到对应版本,这个异常也不会捕获请求发送前的JSON序列化错误。 - 异常捕获顺序错误:就算后续你升级requests版本调整了捕获逻辑,也需要将子类异常的捕获放在父类异常前面,否则
RequestException会先捕获所有属于它子类的异常,后面的InvalidJSONError分支永远不会触发。
修复方案
- 先修正传入的json参数格式,确认是合法的字典结构,如果确实需要传集合类数据,先转成列表再传入。
- 新增对
TypeError的捕获,覆盖JSON序列化阶段的异常,参考代码如下:
import requests ... try: # 示例修正为合法字典,可根据实际业务调整参数 response = requests.post("http://localhost:8000", json={"key": ""}) except requests.exceptions.InvalidJSONError: print "Invalid JSON Error." except requests.exceptions.RequestException as e: print e except TypeError as e: print "JSON序列化失败:", e ...
- 如果需要持续兼容requests 2.26.0及更旧版本,可以移除
InvalidJSONError的捕获,或者在解析接口返回值时手动处理JSON解析错误。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

