Python零基础通关教程(六):异常处理与数据持久化实战(打造健壮日记本系统)

一、知识衔接:构建工业级应用能力

前五篇核心能力
✅ 面向对象编程 ✅ 类与对象 ✅ 模块化设计 ✅ 项目架构
本篇新维度

graph LR
    A[OOP日记系统] --> B[异常处理]
    A --> C[数据持久化]
    B --> D[程序健壮性]
    C --> E[JSON存储]

二、异常处理:让程序更稳定

1. 什么是异常?(新手友好解释)

  • 现实比喻:就像开车时遇到的突发路况(如爆胎、没油)

  • 程序表现:代码执行时遇到的意外错误(如文件找不到、除零错误)

# 典型异常场景
try:
    num = int(input("请输入数字:"))  # 用户输入字母会报错
except ValueError:
    print("输入的不是有效数字!")

2. 异常处理模板(企业级写法)

class DiarySystem:
    def save_to_file(self, content):
        try:
            with open("diary.json", "r+") as f:
                # 文件操作代码...
        except FileNotFoundError:
            print("警告:日记文件不存在,已自动创建")
            # 创建文件的补救措施...
        except json.JSONDecodeError:
            print("错误:日记文件损坏,请检查!")
        finally:
            print("存储流程执行完毕")

三、JSON数据持久化:专业存储方案

1. JSON格式的优势

  • 数据结构友好:完美对应Python字典/列表

  • 跨平台通用:所有编程语言都支持

  • 人类可读:比普通文本更规范,比数据库更轻量

2. 核心方法对比

方法作用示例
json.dump()将对象写入JSON文件json.dump(data, f)
json.load()从文件加载JSON对象data = json.load(f)
json.dumps()对象转JSON字符串s = json.dumps(data)
json.loads()字符串转Python对象data = json.loads(s)

3. 日记存储改造实战

import json

class DiarySystem:
    def __init__(self, username):
        self.username = username
        self.file_path = f"{username}_diary.json"
        self.__load_data()  # 初始化时自动加载数据
    
    def __load_data(self):
        """私有方法:加载数据"""
        try:
            with open(self.file_path, "r") as f:
                self.data = json.load(f)
        except (FileNotFoundError, json.JSONDecodeError):
            self.data = {"diaries": []}
    
    def add_diary(self, content):
        """添加日记"""
        new_entry = {
            "time": datetime.now().strftime("%Y-%m-%d %H:%M"),
            "content": content
        }
        self.data["diaries"].append(new_entry)
        self.__save_data()
    
    def __save_data(self):
        """私有方法:保存数据"""
        with open(self.file_path, "w") as f:
            json.dump(self.data, f, indent=2, ensure_ascii=False)

四、输入验证:防御式编程技巧

1. 日期格式验证

def validate_date(date_str):
    try:
        datetime.strptime(date_str, "%Y-%m-%d")
        return True
    except ValueError:
        return False

# 在写入方法中添加验证
if not validate_date(input_date):
    print("日期格式错误!应为YYYY-MM-DD")

2. 内容安全检查

def check_content(content):
    forbidden_words = ["密码", "银行卡", "敏感词"]
    for word in forbidden_words:
        if word in content:
            raise ValueError("日记包含敏感词!")
    return True

try:
    check_content(input_text)
except ValueError as e:
    print(e)

五、综合实战:工业级日记本系统

class AdvancedDiarySystem:
    def __init__(self, user):
        self.user = user
        self.system = DiarySystem(user.username)
    
    def run(self):
        while True:
            print("\n1.写日记 2.读日记 3.导出备份 4.退出")
            choice = input("请选择:")
            
            try:
                if choice == "1":
                    self.__write_diary()
                elif choice == "2":
                    self.__read_diary()
                elif choice == "3":
                    self.__export_backup()
                elif choice == "4":
                    break
                else:
                    print("输入无效选项")
            except Exception as e:
                print(f"操作失败:{str(e)}")
                self.__log_error(e)

    def __write_diary(self):
        content = input("请输入日记内容:")
        if len(content) < 10:
            raise ValueError("日记内容至少10个字")
        check_content(content)  # 调用安全检查
        self.system.add_diary(content)
        print("保存成功!")

    # 其他方法省略,完整代码见评论区资源

六、避坑指南

1. 常见JSON错误解决方案

  • 中文字符乱码json.dump(data, f, ensure_ascii=False)

  • 数据类型丢失:JSON不支持Python的datetime类型,需转换为字符串

2. 异常处理原则

  • 具体异常优先:先捕获FileNotFoundError等具体异常

  • 最后捕获Exception:兜底处理未知错误

  • 记录错误日志:使用logging模块记录异常信息

学习路线建议

1. 今日实践任务

# 任务:给学生成绩管理系统添加异常处理
# 要求:
# - 输入非数字成绩时友好提示
# - 文件读写使用JSON格式
# - 添加数据备份功能
class GradeManager:
    # 在之前类的基础上改造...

2. 调试技巧

# 打印完整错误信息
import traceback

try:
    # 可能出错的代码
except:
    traceback.print_exc()

📢 下期预告:Python自动化办公实战(Excel/Word/PDF处理)
💡 学完本篇你将能:开发出真正可投入使用的应用程序!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值