PY / LAB 基础实验 07
A SMALL MACHINE FOR BIG IDEAS

出错不可怕,
可怕的是没人接住。

逐步运行预设程序:看异常在哪一行冒出来、沿调用栈向上找 except,
finally 何时执行,以及 assert 什么时候会拦下程序。每一步都来自真实 Python 的跟踪。

FIG. 07 / EXCEPTION READERPython 异常与断言读码台
1234567891011EXC·LAB
← → 单步 · 空格 播放/暂停 · PgDn 下一个程序正在校准
高亮行 = 即将执行的那一行

左侧滑台指向当前行,异常发生时竖旗落下。右侧跳线连到下一步要执行的行,虚线表示这次跳转是异常造成的。右上三个寄存器是调用栈:最上面是正在执行的函数,下面是等它返回的调用者;亮起的警报块标出异常此刻停在哪一层。纸带显示 print 输出,程序因异常终止时会打印 Traceback。

准备—
FIELD NOTES

把规则带走

01 / 异常

出错时 Python 抛出异常

常见类型:ZeroDivisionError 除以零、ValueError 值不合适、TypeError 类型不对、IndexError 索引越界、KeyError 键不存在、NameError 名字未定义、AttributeError 没有该属性。

没有处理的异常会让程序立即终止,并打印 Traceback:从上往下是调用路径,最后一行是错误类型和说明,读错误先看最后一行。

02 / try

try → except → else → finally

try 里出错,立即跳到第一个类型匹配的 except,try 里剩下的语句不再执行。except 类型 as e 取得异常对象,except (A, B) 一次捕获多种,父类能捕获子类。

else 在没出错时执行;finally 无论如何都执行,即使 try 里已经 return。没有匹配的 except,异常就沿调用栈继续向上,直到被捕获或程序终止。

03 / raise 与 assert

主动报错,提前发现问题

raise ValueError('说明') 主动抛出异常;单独的 raise 在 except 中把当前异常再抛出。继承 Exception 可以自定义异常类型。

assert 条件, '说明':条件为假时抛出 AssertionError。不要给条件和说明一起加括号(永远为真)。python -O 会删除所有 assert,所以校验用户输入要用 if + raise,assert 只用于检查程序自身的逻辑。