异常(exception)是程序运行过程中出现的非正常情况。异常不一定意味着程序必须崩溃;如果提前设计好处理方式,程序可以给出提示、记录问题,或者继续执行后续逻辑。
常见异常
异常类型会说明失败的类别:
ValueError值不符合要求,例如把 "3.6" 转成 int。
ZeroDivisionError除数为 0。
IndexError列表下标越界。
KeyError字典中没有这个键。
FileNotFoundError打开不存在的文件。
AttributeError访问不存在的属性。
异常不应该代替普通条件判断。简单规则通常先用 if;异常更适合处理运行到某一步才知道是否会失败的情况。
知识测验
题目
除数为 0 通常触发哪个异常?
try、except、else 与 finally
try 放可能失败的操作;异常一旦产生,try 中剩余语句会被跳过。Python 寻找匹配的 except,把异常交给处理代码。没有异常才进入 else;无论哪条路径,finally 都负责收尾。
互动实验
异常路径调试器:从风险代码到安全收尾
访问权限免费
选择一次输入并单步运行。左侧高亮下一行,右侧同步显示变量、异常对象和控制流。
PYTHON● DEBUG
01try:02 result = a / b03except (ZeroDivisionError, TypeError) as error:04 message = type(error).__name__05else:06 message = result07finally:08 cleaned = True
a21
b4
result—
exception—
cleanedFalse
1/6 · trytry:
dividend = int(input("Enter dividend: "))
divisor = int(input("Enter divisor: "))
quotient = dividend / divisor
except ValueError:
print("Only integers are supported.")
except ZeroDivisionError:
print("Divisor cannot be 0.")
else:
print("Result:", quotient)
finally:
print("This calculation is finished.")知识测验
题目
try 没有发生异常时,哪个代码块负责成功路径?
捕获具体异常
不要一开始就写过宽的 except Exception。如果什么异常都捕获,程序可能把真正的 bug 也吞掉。只捕获当前操作预期的失败,错误原因和处理动作会更明确。
try:
score = int(input("Enter score: "))
except ValueError:
print("Score must be an integer.")知识测验
题目
为什么应该优先捕获预期的具体异常?
主动抛出异常:raise
raise 让函数主动报告输入违反了自己的要求。函数负责发现问题,调用者负责决定怎样提示、重试或记录。
def normalize_score(score):
if score < 0 or score > 100:
raise ValueError("Score must be between 0 and 100.")
return score / 100
try:
ratio = normalize_score(120)
except ValueError as error:
print("Invalid input:", error)动手练习
安全地创建 Circle 对象
- Circle.__init__ 在半径为负数时主动抛出 ValueError。
- 主程序在 try 中把输入转换成 float 并创建对象。
- 分别捕获无效数字和负半径产生的 ValueError,并打印异常信息。
- 增加 finally,始终打印“检查结束”。