python捕获多个异常需据需求选择:统一处理用元组如except (valueerror, typeerror) as e;差异化处理用多except块并注意子类在前;python 3.11+支持except*配合exceptiongroup处理并发异常。

Python中捕获多个异常,核心是用元组包裹异常类型,或用多个except块分别处理——关键在于区分“统一处理”和“差异化处理”两种需求。
用元组一次性捕获多个异常
当不同异常需要执行相同逻辑(比如统一记录日志、提示用户重试),可将异常类放入元组:
- 语法:
except (ValueError, TypeError, KeyError) as e: - 注意括号不能省略,否则会触发语法错误
- 元组中异常按继承顺序无关,Python会逐个匹配最具体的异常类型
- 示例:
try:
data = json.loads(user_input)
result = data['id'] / data['count']
except (json.JSONDecodeError, KeyError, ZeroDivisionError):
print("输入格式有误或数据不完整")
用多个except块做精细化处理
当每种异常需不同响应(如网络失败重试、权限不足提示升级),应分开写except:
系统简介:冰兔BToo网店系统采用高端技术架构,具备超强负载能力,极速数据处理能力、高效灵活、安全稳定;模板设计制作简单、灵活、多元;系统功能十分全面,商品、会员、订单管理功能异常丰富。秒杀、团购、优惠、现金、卡券、打折等促销模式十分全面;更为人性化的商品订单管理,融合了多种控制和独特地管理机制;两大模块无限级别的会员管理系统结合积分机制、实现有效的推广获得更多的盈利!本次更新说明:1. 增加了新
- 顺序很重要:子类异常必须写在父类之前,否则会被父类提前捕获
- 常见组合:
ConnectionError→TimeoutError→Exception(兜底) - 示例:
try:
response = requests.get(url, timeout=5)
except requests.ConnectionError:
print("无法连接服务器,请检查网络")
except requests.Timeout:
print("请求超时,请稍后重试")
except requests.RequestException as e:
print(f"其他请求错误:{e}")
使用ExceptionGroup处理并发异常(Python 3.11+)
异步任务或asyncio.gather()可能同时抛出多个异常,传统方式难以区分来源:
立即学习“Python免费学习笔记(深入)”;
-
ExceptionGroup把多个异常打包成一个对象,保留各自上下文 - 用
except*(星号except)匹配其中部分异常,不中断其余异常传播 - 示例:
try:
await asyncio.gather(task_a(), task_b(), task_c())
except* ConnectionError as eg:
print(f"有{len(eg.exceptions)}个连接失败")
except* ValueError as eg:
print("参数校验失败")
避免常见陷阱
多异常处理容易踩坑,这几个细节要注意:
- 不要用
except Exception:吞掉所有异常,尤其别放在最后还空着——会隐藏真正问题 - 元组中写错异常名(如
IOErro少个r)会导致NameError,运行时报错而非捕获 - 在
except块里抛新异常时,用raise ... from e保留原始异常链,方便调试 - 若需捕获但忽略某异常,显式写
pass,别留空行——提高可读性








