Python多线程使用requests库出现线程异常,如何关闭或简化异常提示?
问题原因定位
你遇到的异常大概率来自两类场景:
- 多线程共用
requests.Session实例:requests的Session对象本身不是线程安全的,多线程并发调用同一个Session发送请求时,会出现响应数据解析错乱、连接池资源竞争的问题,刚好这个接口返回的结构解析要求高,所以触发报错 - 缺少错误兜底逻辑:请求可能因为网络波动、账号Cookie失效、接口限流返回非200状态码、非JSON格式响应,或者返回的JSON数据中不存在
RobuxBalance字段,没有异常捕获就会直接抛出线程未处理异常
修复方案
1. 新增异常捕获逻辑,简化异常提示
将请求和解析逻辑包裹在异常捕获块中,可自定义错误输出格式,避免完整栈追踪打印影响使用体验:
import requests from requests.exceptions import RequestException try: r = req.get("https://api.roblox.com/users/account-info", timeout=10) # 先校验请求状态是否正常 r.raise_for_status() resp_json = r.json() robux_balance = resp_json.get("RobuxBalance") if robux_balance is None: # 自定义精简错误提示 print("账户信息接口返回值缺少RobuxBalance字段") except RequestException as e: print(f"账户信息请求失败: {str(e)}") except ValueError: print("账户信息接口返回非合法JSON格式") except Exception as e: print(f"账户信息处理未知错误: {str(e)}")
2. 修复多线程Session安全问题
如果你的req是全局共用的requests.Session实例,任选以下一种方案修复:
- 每个线程单独创建自己的Session实例,不要跨线程共用
- 调用Session发送请求前加线程锁,避免并发调用
- 不使用Session,直接调用
requests.get()方法发送请求,每次请求独立维护连接
3. 可选:全局设置线程异常处理钩子
如果需要统一简化所有线程的异常提示,可自定义全局线程异常处理函数:
import threading import sys def custom_thread_excepthook(args): exc_type, exc_value = args.exc_type, args.exc_value # 只打印精简错误信息,不输出完整栈追踪 print(f"线程报错: {exc_type.__name__}: {exc_value}") threading.excepthook = custom_thread_excepthook
内容的提问来源于stack exchange,提问作者Arti
相关产品推荐
相关产品推荐

