Python 异常处理的最佳实践可归纳为"捕获要窄、信息要全、清理要稳":
- 只捕获能处理的具体异常:
except FileNotFoundError而非裸except:或except Exception;裸 except 会吞掉KeyboardInterrupt、SystemExit等不该吞的异常,掩盖 bug。 - try 块尽量小:只包住可能抛错的那几行,避免误捕无关代码的异常。
- 资源清理由机制保证:文件、锁用
with;必须用 try/finally 时确保 finally 只做清理、不 return(finally 的 return 会覆盖 try 中的返回值和异常)。 - 异常链与上下文:重新抛出新异常时用
raise NewError(...) from e保留因果链,便于排障;raise不带参数原样重抛。 - 善用 else:
try/except/else/finally中 else 放"没出错才执行"的代码,使意图清晰。 - 自定义异常:库/框架定义自己的异常基类,调用方可精确捕获。
- 日志用
logging.exception:自动带堆栈,别只打str(e)。
哲学层面:Python 推崇 EAFP("先做再道歉",用异常处理流程)优于 LBYL("先检查再跳",一堆前置 if),但异常不该被当作常规业务分支滥用。追问方向:异常的性能开销(抛出贵、不抛几乎免费)、3.11 的 ExceptionGroup 与 except *。