Python异常处理的核心在于理解异常对象生成、栈帧传播及try/except/finally协作机制,而非单纯记忆语法。
这标题看着像课程宣传,实际想解决的无非是:Python异常到底怎么捕获才不漏、怎么抛才合理、为什么有时像没生效一样?答案不在“学第几讲”,而在搞清三件事:异常对象怎么生成、栈帧怎么传播、怎么协作。
异常不是“错误提示”,而是运行时对象
很多人以为
就是“抛个错误”,其实它创建了一个
实例,并立刻中断当前执行流。这个对象有
、
、
等属性,能被检查、修改、链式传递。
用
可拿到当前异常三元组:
,比只写
更可控
显式构造异常链,避免丢失原始上下文;
单独写会原样重抛(保留原 traceback)
自定义异常必须继承
或其子类,否则
捕不到(比如直接继承
的会跳过常规捕获)
except 子句匹配靠的是类型继承关系,不是字符串匹配
写
能捕获所有
及其子类(如
),但不会捕获
——哪怕错误信息里有“value”这个词。
多个
按顺序匹配,**先写的优先**;
放最下面,否则会吞掉更具体的异常
是元组解包语法,不是“或”的逻辑短路;两个类型都按继承规则检查
空
等价于
,会捕获
和
,通常不该用
finally 不等于“一定会执行”,它会被 os._exit() 或 segfault 绕过
的作用是保证清理代码在
块退出时运行(无论是否异常、是否
、是否
),但它依赖 Python 解释器正常接管控制权。
Find JSON Path Online
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
下载
立即学习
“
Python免费学习笔记(深入)
”;
会立即终止进程,跳过所有
和析构函数
C 扩展中发生段错误(segfault)、被
强杀,
也失效
如果
里又抛异常,它会覆盖
块里的异常(除非原异常还没被处理)
常见误用:用异常代替流程控制
比如用
判断字典键是否存在,或用
控制循环——这不是错,但性能差且语义不清。Python 提供了更直接的方式。
查键用
或
,比
快 2–3 倍(尤其键大概率存在时)
迭代用
,别手动调
+ 捕
需要“异常驱动逻辑”的场景(如解析不确定结构的 JSON),才适合用
主干流程
真正难的不是记住语法,而是判断:这个异常该被谁处理?该继续向上冒泡,还是就地消化?该记录日志后重抛,还是转成用户友好的提示?这些决策藏在业务边界里,而不是关键字后面。
excepttry/except/finallyraise ValueError("xxx")ValueErrorargs__traceback____cause__sys.exc_info()(type, value, traceback)except:raise ... from ...raiseExceptionexcept Exception:BaseExceptionexcept ValueError:ValueErrorUnicodeDecodeErrorTypeErrorexceptexcept Exception:except (ValueError, TypeError):except:except BaseException:KeyboardInterruptSystemExitfinallytryreturnbreakos._exit(0)finallykill -9finallyfinallytrytry:
raise ValueError("original")
except ValueError:
print("handled")
raise KeyError("new") # 这个会取代 ValueError 被抛出
finally:
print("cleanup") # 仍会执行KeyErrorStopIterationdict.get(key, default)key in dicttry/except KeyErrorfor item in iterable:next()StopIterationtry/exceptexcept