python异常处理的核心是精准捕获、合理响应、避免掩盖问题:只捕获明确知道如何处理的具体异常,按子类到父类排序,else/finaly分清逻辑,记录日志而非print,必要时自定义异常。

Python异常处理的核心是精准捕获、合理响应、避免掩盖问题。写 try except 不是为了“让程序不崩溃”,而是为了在可控范围内处理可预期的失败,并把真正意外的问题暴露出来。
只捕获你明确知道如何处理的异常
不要用空的 except: 或宽泛的 except Exception:,这会吞掉 KeyboardInterrupt、SystemExit 甚至内存耗尽等严重错误,导致调试困难、行为诡异。
- 优先捕获具体异常类型,比如
FileNotFoundError、ValueError、requests.exceptions.ConnectionError - 如果需要多个处理分支,按从具体到宽泛的顺序排列(子类在前,父类在后)
- 不确定时,先跑一次看实际抛出什么异常,再针对性捕获
在 except 中做有意义的事,而不是“假装没事”
捕获异常后,要么修复、重试、降级、记录并继续,要么重新抛出(或包装后抛出)。避免只写 pass 或空 print()。
- 记录日志比
print()更可靠:logging.error("Failed to load config", exc_info=True) - 需要重试时,控制次数和间隔,避免无限循环
- 若当前层无法处理,用
raise原样抛出,或用raise MyCustomError(...) from e保留原始上下文
善用 else 和 finally,让逻辑更清晰
else 块在没异常时执行,适合放不希望被异常拦截的“成功路径”代码;finally 一定执行,适合清理资源(如关闭文件、释放锁)。
立即学习“Python免费学习笔记(深入)”;
- 避免在
try块里混入大量无关逻辑——只包可能出错的部分 - 用
with语句代替手动try/finally关文件或数据库连接,更简洁安全 - 如果清理逻辑复杂且可能出错,
finally中的异常会覆盖原异常,必要时要加嵌套处理
自定义异常,提升可读性和控制力
内置异常不够表达业务语义时,继承 Exception(或更具体的基类)定义自己的异常,能让调用方更准确地识别和响应。
- 命名体现意图,如
UserNotFoundError、PaymentValidationError - 在
__init__中接受必要参数,便于构造带上下文的错误信息 - 配合文档说明哪些地方会抛出它,以及建议如何处理
不复杂但容易忽略:异常处理不是越“全”越好,而是越“准”越好。少一层无意义的包裹,多一分对失败场景的理解。






