14_错误异常与资源清理
把可恢复的错误与程序缺陷分开处理,并正确使用 `try` 结构。
Python 基础专题 14:错误、异常与资源清理
学习目标:把可恢复的错误与程序缺陷分开处理,并正确使用
try结构。
核心知识
异常表示执行被打断。try 中出错后,匹配的 except 处理它;else 仅在没有异常时执行;finally 无论成功失败都执行,常用于清理。只捕获自己能处理的具体异常,例如 ValueError、FileNotFoundError,不要在底层函数中把所有错误变成空值。
def parse_age(raw: str) -> int:
try:
age = int(raw.strip())
except ValueError as exc:
raise ValueError("年龄必须是整数") from exc
if not 0 <= age <= 120:
raise ValueError("年龄超出允许范围")
return age
raise 主动抛异常,raise ... from exc 保留原始原因。assert 用于开发时检查不变量,不能代替来自用户的输入校验,因为优化模式可能禁用断言。自定义异常可继承 Exception,适用于清晰表达业务失败。捕获后若无法恢复,可附加上下文再抛出。
资源优先用 with 管理;它封装了进入与退出逻辑,比到处手写 finally: close() 更不容易遗漏。记录错误时既要给排障线索,也要避免把密码等敏感输入写入日志。
逐步理解
异常处理的关键是“能恢复才捕获”。例如年龄输入非法,命令行入口可以提示用户重输;数据库连接失败,数据处理函数可能只能向上传递。finally 即使在 return 或抛错路径也会执行,但在 finally 中再抛异常可能掩盖原错误。写测试时同时验证正常结果与错误类型,而不是只看打印消息。
动手练习
练习:分别用 "18"、"abc"、"-1" 调用 parse_age。答案:第一个返回 18,后两个抛 ValueError,错误消息不同。