← Backend / Python / 基础专题

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,错误消息不同。