Python如何复用字符串形式的异常列表,避免多分支重复编写except异常
可复用多异常捕获的实现方案
两个必须明确的Python语法硬限制
except子句无法直接识别字符串形式的异常名,也不支持直接传入普通列表作为待捕获的异常集合- 语法层面要求,同一个
except要捕获多个异常时,必须传入由真实异常类组成的元组,传入列表会直接触发语法错误
完整实现步骤
1. 将字符串形式的异常名列表转换为可被except识别的异常元组
如果你需要基于字符串格式的异常名预先配置可复用集合,首先需要把字符串映射成Python可识别的实际异常类:
# 导入Python内置异常的基类,所有内置异常都挂载在这个基类的命名空间下 from builtins import Exception # 如果存在自定义异常、第三方库异常,需要先导入对应的模块 # from your_custom_module import MyCustomError # 你预先定义的字符串形式异常名列表 except_name_list = ['ValueError', 'TypeError'] # 遍历字符串列表,将每一项转换为真实异常类,最后拼接成要求的元组格式 reusable_except_set = tuple( getattr(Exception, err_name) for err_name in except_name_list )
注意:如果异常不属于内置Exception的命名空间(比如第三方库、自定义模块的异常),可以用
importlib从对应模块获取异常类,例如getattr(importlib.import_module("pandas"), "ParserError")
2. 直接复用转换完成的异常元组
转换得到的元组和手写的多异常写法完全等价,可以直接嵌入各个分支的except子句,不需要重复书写重复的异常定义:
Number = 1 if Number == 1: try: # 分支1的业务逻辑 pass # 直接复用预先定义的异常集合 except reusable_except_set: # 分支1的异常处理逻辑 pass Number2 = 2 if Number2 == 2: try: # 分支2的业务逻辑 pass except reusable_except_set: # 分支2的异常处理逻辑 pass
常见踩坑提示
- 不要尝试直接把字符串列表传给
except,比如except ["ValueError"],Python不会自动完成字符串到异常类的解析,会直接抛出类型错误 - 不要用列表存储异常集合,哪怕列表里存的都是真实异常类,写成
except [ValueError, TypeError]也会触发语法错误,必须转换为元组格式 - 基础语法结构上,
if判断块不能直接衔接except子句,必须在if块内部先写try代码块,再跟随对应的except子句
内容的提问来源于stack exchange,提问作者user12503028
相关产品推荐
相关产品推荐

