【小学生都能看懂的Python入门教程】第三章:文件操作与异常处理 (读写文件、异常捕获) 异常处理——给未知一个拥抱:程序员的急诊室日记

在这里插入图片描述

异常处理——给未知一个拥抱:程序员的急诊室日记

一、异常是什么?代码的"啊哦"时刻

1. 程序的意外怀孕事件

# 当代码遇到意外时
print(10 / 0)  # ZeroDivisionError: 数学老师的怒吼
open("不存在的文件.txt")  # FileNotFoundError: 薛定谔的文件
int("abc")  # ValueError: 文字游戏玩脱了

异常三定律

  1. 没有不会出错的代码,就像没有不掉头发的程序员
  2. 异常可能在任何时候出现,就像老板的突击检查
  3. 不处理的异常会让程序流产(崩溃)

为什么叫异常(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", "该属性需要充值解锁"))

四、实战演练:文件救急小助手

功能说明

  1. 安全读取任意文件
  2. 自动处理常见异常
  3. 提供人性化提示

代码全解析

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)  # 记录异常日记

六、冷知识档案馆

  1. 可以用raise主动抛出异常(像扔手榴弹)
  2. else子句在无异常时执行(try的成功奖金)
  3. finally就像家政阿姨——无论是否异常都会打扫
  4. 自定义异常是代码界的方言(继承Exception类)

为什么finally总要执行?
因为代码也需要收拾残局,就像吃完外卖要丢垃圾

结语:与未知和解的艺术

现在你已经掌握:
✅ 异常的本质与分类
✅ try-except急救技术
✅ 常见异常处理方案
✅ 健壮文件读取器的开发

当你能优雅处理各种异常时,就像获得了代码世界的保险单。记住,优秀的异常处理不是避免错误,而是在暴风雨中为程序撑起一把伞。毕竟,正如生活充满意外,代码世界也需要学会与未知共舞。

下期预告:《面向对象初探——代码也能“活”过来:虚拟猫咖开业指南》


课后彩蛋:在异常处理中添加以下代码,收获隐藏成就:

except KeyboardInterrupt:
    print("\n检测到程序员紧急逃生行为!")
# 试试在运行时按下Ctrl+C
posted @   爱上编程技术  阅读(2)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示