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 抓取数据

无论哪条路,方法都一样:多写、多错、多改。祝编程愉快!

← 返回教程列表
顶部