2026-09-23
Python 入门系列(十·毕业课):异常处理与综合项目
try/except 是程序的安全气囊。学习精确捕获常见异常,然后用毕业项目"记账小工具"综合运用全部 9 课知识,附进阶路线图。
异常处理与综合项目(毕业课)
预计学习时间:70 分钟 · 本系列第 10 / 10 课
一、用户总会"不按套路出牌"
你的程序让你输入数字,用户偏偏输入"abc";你让他打开文件,文件偏偏不存在。程序"崩掉"(报错退出)很正常,但好的程序要接得住这些意外。
**核心比喻:try/except 就是程序的安全气囊。**平时用不上,出车祸(异常)的那一刻,它保证车子不散架、人还能继续走。
┌─ 没出事 ✓ ──► 跳过 except ──┐
try 危险代码 ─┤ ├─► 程序继续
└─ 出事了 ✗ ──► 执行 except ──┘
(气囊弹出,接住)
二、try / except 基本用法
try:
age = int(input("请输入年龄:"))
print("明年你", age + 1, "岁")
except ValueError:
print("输入的不是数字,请重试!") # 接住意外,程序不崩
print("程序正常结束")
请输入年龄:abc
输入的不是数字,请重试!
程序正常结束
常见异常类型:ValueError(值不对)、ZeroDivisionError(除以零)、FileNotFoundError(文件不存在)、KeyError(字典键不存在)、IndexError(下标越界)。
三、更完整的防护组合
try:
a = int(input("被除数:"))
b = int(input("除数:"))
print("结果:", a / b)
except ValueError:
print("必须输入整数!")
except ZeroDivisionError:
print("除数不能为 0!")
except Exception as e: # 兜底:接住其他所有异常
print("未知错误:", e)
else:
print("一切顺利才执行这里")
finally:
print("无论成败都执行(常用于收尾)")
建议精确捕获:先写具体异常类型,最后才用 Exception 兜底。全裸写 except: 会把真正的 bug 也藏起来,不利于学习。
四、毕业项目:记账小工具
综合运用全部 9 课知识:变量、输入转换、循环、判断、字典、函数、文件、异常。
import os
FILE = "accounts.txt"
def load_records():
"""读取历史账目 → 返回 [(用途, 金额), ...]"""
records = []
if os.path.exists(FILE): # 文件存在才读
with open(FILE, "r", encoding="utf-8") as f:
for line in f:
parts = line.strip().split(",")
if len(parts) == 2:
records.append((parts[0], float(parts[1])))
return records
def save_record(name, amount):
with open(FILE, "a", encoding="utf-8") as f:
f.write(f"{name},{amount}\n")
def show_summary(records):
if not records:
print("还没有账目")
return
total = sum(amount for _, amount in records)
print(f"共 {len(records)} 笔,合计 {total:.2f} 元")
for i, (name, amount) in enumerate(records, 1):
print(f"{i}. {name}: {amount:.2f}")
def main():
records = load_records()
while True:
print("\n===== 记账本 =====")
print("1.记一笔 2.看汇总 0.退出")
choice = input("选择:").strip()
if choice == "1":
name = input("用途:").strip()
try:
amount = float(input("金额:"))
except ValueError:
print("金额必须是数字!")
continue
records.append((name, amount))
save_record(name, amount)
print("已记录")
elif choice == "2":
show_summary(records)
elif choice == "0":
print("再见!账目已保存到", FILE)
break
else:
print("没有这个选项")
main()
知识点打卡(毕业清单):
- ✅ 第2课:input + float 类型转换(金额输入)
- ✅ 第4课:if/elif/else 菜单分支
- ✅ 第5课:while True + break 主循环
- ✅ 第6课:列表存多笔账目(元组作元素)
- ✅ 第8课:函数拆分职责,main 统筹全局
- ✅ 第9课:文件读写实现数据持久化
- ✅ 第10课:try/except 防住乱输入
五、避坑指南
- ❌ 用 try 包住大段代码来"掩盖 bug" —— 只包可能出事的那一两行
- ❌ 捕获异常后什么都不做 —— 至少给用户一句提示
- ❌ 忘记数据持久化 —— 程序一关账目全丢,记得写文件
六、毕业感言与下一步
恭喜完成全部 10 课!你已经掌握了 Python 的核心地基。接下来推荐三条进阶路线:
- 数据分析:学习 pandas、matplotlib,处理 Excel 表格、画图表
- 自动化办公:批量改文件名、自动发邮件、操作 Excel/Word(openpyxl、python-docx)
- Web / 爬虫:Flask 建网站、requests 抓取数据
无论哪条路,方法都一样:多写、多错、多改。祝编程愉快!