自定义异常必须继承exception类,而非baseexception;因继承baseexception会导致无法被except exception捕获,且可能意外拦截systemexit、keyboardinterrupt等系统级异常。

自定义异常必须继承 Exception,而不是 BaseException
直接从 BaseException 继承会导致异常无法被常规 except Exception: 捕获,极易漏处理——比如你写了 class MyError(BaseException),但调用方只写 except Exception:,这个错误就直接冒泡到顶层,程序崩溃。
- 正确做法:所有业务相关异常都应继承
Exception,例如class DatabaseConnectionError(Exception) - 仅在极特殊场景(如实现退出信号、中断控制流)才考虑
BaseException子类,且需明确文档说明 - 类名末尾加
Error后缀,是 PEP 8 明确建议的命名惯例,便于调用者一眼识别这是错误类型
try-except 块要按异常具体类型分层捕获,别偷懒写 except:
except: 或 except Exception: 看似省事,实则掩盖真实问题:它会吞掉 KeyboardInterrupt、SystemExit,甚至你本想让其终止程序的 MemoryError。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 优先列出最具体的异常类型,例如先
except FileNotFoundError:,再except PermissionError: - 把
except Exception:放在最后兜底,且务必记录日志(logging.exception("unhandled error")),不能静默吞掉 - 永远不要用
except:(空 except),它连Ctrl+C都拦截,调试时会让你怀疑人生
raise 时善用 from 和 from None 控制异常链
原始错误上下文一旦丢失,排查难度指数级上升。比如从 KeyError 转为 AttributeError 时,不保留原 traceback 就等于删掉了关键线索。
- 想保留原始异常堆栈?用
raise NewError("msg") from original_exc - 想彻底替换异常(如隐藏敏感路径)?用
raise NewError("clean msg") from None,但必须把关键信息(如出错键名、文件名)写进新消息里 - 避免裸
raise在 except 块里——它虽保留原 traceback,但若中间有逻辑修改了状态,可能误导定位
空行、缩进、参数对齐这些细节真会影响异常可读性
PEP 8 不只是“看着舒服”,它直接影响异常处理逻辑的维护成本。比如多层嵌套的 try 块若缩进混乱,很容易看错哪个 except 对应哪段代码。
-
try/except/else/finally各块之间用空行分隔,和顶层函数保持一致(两空行) - 长参数列表换行时,把
except的异常类型和冒号对齐,例如:except (ValueError, TypeError, UnicodeDecodeError) as e:
- 多个
except块按异常严重程度或发生频率降序排列,不是按字母顺序
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










