这套课程按知识依赖排列。本篇的前置知识是:第 16、22、30 篇。学完后,你应该能够处理可预期错误并保留明确失败信息。
本篇要解决的问题
本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6,在 macOS 环境核验;除明确标注的终端命令外,代码本身只使用 Python 标准能力。
先看清一个容易误解的细节
异常发生后,当前正常路径停止,解释器寻找匹配的 except;无论是否异常,finally 都会在离开结构前执行。
核心概念
- 只捕获能够处理的具体异常,不使用空的
except吞掉全部错误。 raise用于明确拒绝不符合函数约定的数据。- 异常信息应说明失败原因,但不泄露密钥、用户隐私或内部路径。
跟着示例运行
把下面代码保存到本课脚本并运行:
def parse_age(text):
age = int(text)
if age < 0:
raise ValueError("年龄不能为负数")
return age
try:
age = parse_age("18")
except ValueError as error:
print("输入错误:", error)
else:
print("年龄:", age)
finally:
print("处理结束")
预期结果:
年龄: 18
处理结束
输出中包含环境路径、集合元素或日志格式时,具体文字和顺序可能随本机环境变化;判断是否成功应以本篇说明的关键结果为准。
按执行顺序拆开看
int()或主动raise都可能产生ValueError,控制流立即离开当前正常路径。- 有异常时进入匹配的
except;没有异常时执行else;两种情况最后都会执行finally。
再看一个具体细节
except、else 和 finally 的职责不同,不能只看它们出现的顺序。
except 处理匹配异常,else 只在无异常时运行,finally 负责两条路径都需要的清理动作。
再看一个具体细节
try 范围越大,越难判断究竟允许哪一步失败。
只把可能产生预期异常的操作放进 try,后续正常业务放进 else,错误边界会更清楚。
初学者容易混淆的地方
- 使用裸
except:后什么也不做,真实编程错误也会被隐藏。 - 把整个程序包在一个巨大
try中,无法判断究竟哪一步允许失败。
练习
- 让
parse_age分别处理"abc"和"-1"。 - 为文件读取捕获
FileNotFoundError并给出清晰提示。
练习应先独立完成,再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力,不要求提前搜索复杂写法。
本篇边界
本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程;先确保能够解释示例中每一行代码,再进入下一篇。
相关文章
01|Python 程序从源码到输出经历了什么
面向按顺序学习 Python 的初学者,本篇在零基础上,帮助读者理解源代码、解释器和输出之间的关系。
02|在 macOS 安装并确认 Python 3 环境
面向按顺序学习 Python 的初学者,本篇在第 01 篇知识上,帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。
03|交互式解释器和 Python 脚本怎么选择
面向按顺序学习 Python 的初学者,本篇在第 02 篇知识上,帮助读者根据任务选择 REPL 或 `.py` 脚本。
04|建立第一个 Python 项目目录
面向按顺序学习 Python 的初学者,本篇在第 03 篇知识上,帮助读者理解当前目录并正确运行项目脚本。

