Python裸except触发报错,如何替代try-except实现文本行数据提取?
问题原因
静态检查工具提示禁止使用裸except,是因为裸except会捕获所有层级的异常,包括用户按Ctrl+C触发的程序中断、系统触发的程序退出信号等非业务异常,既违反PEP8规范,也会把真实的代码逻辑错误静默吞掉,极难排查。
你原代码里用裸except静默跳过,本质是兜底两类索引越界错误:
- 单行文本长度不足3,访问
raw_results[i][2]时触发字符串索引越界 - 遍历到接近文件末尾的行时,后续关联的球队、比分行数量不足,访问
i+1到i+5位置时触发列表索引越界
这类边界判断场景完全不需要依赖异常捕获,提前做校验即可实现。
无try...except的替代实现
只需要加两层前置校验就能完全规避越界问题:
- 访问行的第三个字符前,先判断当前行长度是否≥3,不满足的行不可能符合筛选条件,直接跳过
- 命中日期行后,先判断剩余行数是否足够提取后续的球队、比分数据,行数不足直接跳过,避免读取列表末尾时越界
优化后的代码如下,同时把重复的换行符处理逻辑提前统一执行,减少冗余代码:
with open(file_to_read, 'r') as fi: # 读取时统一去掉行尾换行符,避免后续重复调用strip raw_results = [line.rstrip('\n') for line in fi] total_lines = len(raw_results) date_of_game = [] home_team = [] away_team = [] home_team_goals = [] away_team_goals = [] for i in range(total_lines): current_line = raw_results[i] # 行长度不足3,不可能满足第三个字符是点号的条件,直接跳过 if len(current_line) < 3: continue if current_line[2] != '.': continue # 校验剩余行数:两种分支最大需要读取到i+5位置,不足则直接跳过 if i + 5 >= total_lines: continue date_of_game.append(current_line[:5]) if raw_results[i+1] != "A Tav.": home_team.append(raw_results[i+1]) away_team.append(raw_results[i+2]) home_team_goals.append(raw_results[i+3]) away_team_goals.append(raw_results[i+4]) else: home_team.append(raw_results[i+2]) away_team.append(raw_results[i+3]) home_team_goals.append(raw_results[i+4]) away_team_goals.append(raw_results[i+5])
补充提示
如果后续场景确实需要用异常捕获,也禁止写裸except,必须明确指定要捕获的异常类型,比如针对索引越界场景写except IndexError:,避免拦截无关的系统级异常。
内容的提问来源于stack exchange,提问作者Al Pan
相关产品推荐
相关产品推荐

