Python 异常在多线程中如何传播?
发布时间 - 2026-01-22 00:00:00 点击率:次Python异常默认不跨线程传播,因各线程有独立栈和异常上下文;子线程未捕获异常时仅触发threading.excepthook,默认打印traceback后退出,不会通知主线程。
Python 中的异常默认不会跨线程传播。主线程无法直接捕获子线程中发生的异常,子线程崩溃也不会中断主线程或其他线程。
为什么异常不自动传播?
每个线程有独立的执行栈和异常处理上下文。当子线程抛出未捕获异常时,Python 会调用 threading.excepthook(默认打印 traceback 并退出该线程),但不会向上通知创建它的线程。
手动捕获并传递异常的常用方法
需要显式将异常信息从子线程“带出来”,常见做法有:
-
使用
queue.Queue:子线程把异常对象(或 (type, value, traceback) 元组)放入队列,主线程定时检查并重新抛出 -
保存到共享变量 + 标志位:用
threading.Event或普通变量标记失败,并将sys.exc_info()结果存入线程安全容器(如threading.local()或加锁的 dict) -
使用
concurrent.futures.ThreadPoolExecutor:调用future.result()时,若子线程出错,会原样抛出该异常(推荐,封装了传播逻辑)
ThreadPoolExecutor 是最简洁的方案
它内部通过 _result 和 _exception 属性保存执行结果或异常,并在 result() 调用时触发重抛:
from concurrent.futures import ThreadPoolExecutor import timedef risky_task(): time.sleep(0.1) raise ValueError("子线程出错了")
with ThreadPoolExecutor() as executor: future = executor.submit(risky_task) try: future.result() # 这里会抛出 ValueError except ValueError as e: print(f"捕获到:{e}") # 输出:捕获到:子线程出错了
自定义 excepthook 可用于日志或调试
如果不想让线程静默退出,可设置全局钩子:
import threading import sysdef custom_hook(args): print(f"[线程异常] {args.thread.name}: {args.exc_value}")
threading.except
hook = custom_hook
def bad_func(): raise RuntimeError("boom")
threading.Thread(target=bad_func).start() # 触发 custom_hook
注意:这仅用于记录,不能替代异常传播逻辑。
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何创建自定义中间件?(Middleware代码示例)
深圳网站制作的公司有哪些,dido官方网站?
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
如何用AI帮你把自己的生活经历写成一个有趣的故事?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
Laravel如何自定义分页视图?(Pagination示例)
如何快速生成高效建站系统源代码?
三星、SK海力士获美批准:可向中国出口芯片制造设备
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
如何确保西部建站助手FTP传输的安全性?
昵图网官网入口 昵图网素材平台官方入口
C++用Dijkstra(迪杰斯特拉)算法求最短路径
微信推文制作网站有哪些,怎么做微信推文,急?
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
如何在橙子建站中快速调整背景颜色?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
高防服务器:AI智能防御DDoS攻击与数据安全保障
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
Laravel怎么调用外部API_Laravel Http Client客户端使用
nginx修改上传文件大小限制的方法
微信小程序 canvas开发实例及注意事项
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
创业网站制作流程,创业网站可靠吗?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
详解jQuery中基本的动画方法
深入理解Android中的xmlns:tools属性
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
音响网站制作视频教程,隆霸音响官方网站?
如何用IIS7快速搭建并优化网站站点?
如何为不同团队 ID 动态生成多个非值班状态按钮
Laravel Session怎么存储_Laravel Session驱动配置详解
SQL查询语句优化的实用方法总结
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
进行网站优化必须要坚持的四大原则
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体


