【小学生都能看懂的Python入门教程】第三章:文件操作与异常处理 (读写文件、异常捕获) 异常处理——给未知一个拥抱:程序员的急诊室日记
异常处理——给未知一个拥抱:程序员的急诊室日记
一、异常是什么?代码的"啊哦"时刻
1. 程序的意外怀孕事件
# 当代码遇到意外时
print(10 / 0) # ZeroDivisionError: 数学老师的怒吼
open("不存在的文件.txt") # FileNotFoundError: 薛定谔的文件
int("abc") # ValueError: 文字游戏玩脱了
异常三定律:
- 没有不会出错的代码,就像没有不掉头发的程序员
- 异常可能在任何时候出现,就像老板的突击检查
- 不处理的异常会让程序流产(崩溃)
为什么叫异常(Exception)?
因为程序在说:“这个情况我例(常)外(没想过)啊!”
二、try-except:代码的急救箱
1. 基础急救套餐
try:
age = int(input("请输入年龄:"))
print(f"明年你就{age+1}岁啦!")
except ValueError:
print("您输入的是火星年龄吗?")
急救流程图:
开始治疗 → 尝试运行代码 → 正常? → 治愈出院
↓异常
→ 匹配症状 → 对症下药 → 恢复运行
↓不匹配
→ 送进ICU(程序崩溃)
2. 多症状会诊
try:
with open("日记.txt") as f:
print(f.read())
except FileNotFoundError:
print("建议检查:1.文件名 2.文件路径 3.是否在梦里创建过这个文件")
except UnicodeDecodeError:
print("检测到外星文字,可能需要RMB 648解锁解码器")
except Exception as e:
print(f"遇到未知异常:{str(e)},已呼叫硅基文明救援")
三、常见异常全家桶
异常类型 | 触发场景 | 人类语言翻译 |
---|---|---|
SyntaxError | 语法错误 | “你的代码单词拼错了!” |
IndexError | 索引越界 | “你要的座位还没造好!” |
KeyError | 字典键不存在 | “这个暗号对不上!” |
TypeError | 类型错误 | “你不能把苹果塞进USB口!” |
KeyboardInterrupt | 用户按Ctrl+C | “程序员跑路了!” |
AttributeError | 属性不存在 | “这个对象没有这个超能力!” |
# 异常情景剧
d = {"name": "小明"}
print(d["age"]) # KeyError登场
# 建议改用get方法:print(d.get("age", "该属性需要充值解锁"))
四、实战演练:文件救急小助手
功能说明
- 安全读取任意文件
- 自动处理常见异常
- 提供人性化提示
代码全解析
def file_rescue():
"""代码界的120急救车"""
while True:
path = input("\n请输入文件路径(输入exit退出):")
if path.lower() == "exit":
break
try:
with open(path, "r", encoding="utf-8") as f:
print("\n" + "="*30)
print(f.read()[:500]) # 只显示前500字符
print("="*30 + "\n文件读取成功!")
except FileNotFoundError:
print(f"「{path}」可能存在于:1.其他宇宙 2.你的想象中 3.回收站")
except PermissionError:
print("权限不足!建议:1.成为管理员 2.三顾茅庐求文件")
except UnicodeDecodeError:
print("检测到神秘代码,可能需要:1.指定编码 2.找占卜师翻译")
except Exception as e:
print(f"遇到未预料的异常:{type(e).__name__} - {str(e)}")
finally:
print("--> 急救完成,随时待命 <--")
if __name__ == "__main__":
file_rescue()
运行示例:
请输入文件路径:/不存在的/文件.txt
「/不存在的/文件.txt」可能存在于:1.其他宇宙 2.你的想象中 3.回收站
--> 急救完成,随时待命 <--
五、异常处理哲学课
1. 防御性编程三原则
- 永远假设用户会输入"香蕉手机"当电话号码
- 认为每个文件都可能突然消失
- 把所有第三方服务都当作薛定谔的猫
2. 异常处理不等于消灭异常
try:
1/0
except:
pass # 最危险的写法:把异常吃掉了!
正确做法:
try:
risky_operation()
except SpecificError as e:
handle_error(e)
log_to_file(e) # 记录异常日记
六、冷知识档案馆
- 可以用
raise
主动抛出异常(像扔手榴弹) else
子句在无异常时执行(try的成功奖金)finally
就像家政阿姨——无论是否异常都会打扫- 自定义异常是代码界的方言(继承Exception类)
为什么finally总要执行?
因为代码也需要收拾残局,就像吃完外卖要丢垃圾
结语:与未知和解的艺术
现在你已经掌握:
✅ 异常的本质与分类
✅ try-except急救技术
✅ 常见异常处理方案
✅ 健壮文件读取器的开发
当你能优雅处理各种异常时,就像获得了代码世界的保险单。记住,优秀的异常处理不是避免错误,而是在暴风雨中为程序撑起一把伞。毕竟,正如生活充满意外,代码世界也需要学会与未知共舞。
下期预告:《面向对象初探——代码也能“活”过来:虚拟猫咖开业指南》
课后彩蛋:在异常处理中添加以下代码,收获隐藏成就:
except KeyboardInterrupt:
print("\n检测到程序员紧急逃生行为!")
# 试试在运行时按下Ctrl+C
代码学习,前言技术分享,深度分析编程技术,普及科普编程技术,天天都要敲代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)