10.3.8 优雅地装聋作哑:程序员的”选择性失聪”艺术
在编程世界里,有时候最明智的选择就是——假装什么都没发生。
没错,我说的就是”静默失败”,这是程序员们最擅长的社交技巧之一(仅次于在会议上假装听懂产品经理的需求)。
当错误遇上”已读不回”
还记得上次我们像个热心的居委会大妈一样,遇到文件找不到就大呼小叫地通知用户吗?
这次我们要学会高冷一点。
就像你收到前任发来的”在吗?”,最好的回应就是——不回应。
Python为我们准备了一个完美的工具:`pass`语句。它就像程序员的”已读不回”功能:
def count_words(path):
"""假装很认真地数单词(其实可能根本没找到文件)"""
try:
# 这里本来应该有些代码
except FileNotFoundError:
pass # 嘘...我们什么都没看见
else:
# 数单词的魔法在这里发生
为什么选择沉默是金?
1. 用户体验:用户不需要知道后台发生了什么,就像你不需要知道餐厅后厨有多少厨师在吵架
2. 程序稳定性:一个小错误不应该让整个程序崩溃,就像成年人不会因为咖啡洒了就躺在地上哭
3. 后续处理:我们可以在用户看不见的地方记录错误,就像偷偷记下谁没来参加你的生日派对
沉默背后的秘密行动

虽然表面上风平浪静,但我们可以暗地里搞点小动作:
except FileNotFoundError:
with open('missing_files.txt', 'a') as f:
f.write(f"{path} was being shady and didn't show up
")
pass # 表面依然保持扑克脸
什么时候该说话,什么时候该闭嘴?
该沉默的情况:
– 错误不影响核心功能
– 用户无法采取任何纠正措施
– 错误是预期内的正常情况
该发声的情况:
– 涉及关键数据丢失或损坏
– 用户需要采取特定行动
– 错误会引发后续问题
记住:好的程序员就像特工,既要能优雅地处理危机,又要能让用户完全察觉不到危机的存在。
毕竟,在编程世界里,有时候最大的美德就是——学会适时地装傻。
10.3.9 错误报告的艺术:该说还是不该说?

在编程的世界里,错误就像生活中的尴尬时刻——有时候需要大声说出来,有时候最好假装什么都没发生。
那么问题来了:什么时候该让用户知道程序出错了,什么时候又该默默吞下这个“苦果”呢?
用户知情权 vs. 清净权
想象一下:
– 如果用户明确知道自己要分析哪些文件,结果某个文件漏掉了,这时候不提醒他,就像朋友明明看到你裤链没拉却故意不说——不够意思!
– 但如果用户只想**快速看到结果(比如统计全网猫咪视频数量),而程序背后其实扫描了100个文件,其中3个打不开……这时候弹个错误提示,就像在电影高潮时突然插播广告——纯属添堵!
Python的`try-except`就像你的私人公关团队:
你可以决定“危机公关”的级别——是开新闻发布会(详细报错),还是发个朋友圈仅自己可见(记录日志但不打扰用户)。

错误也分“内忧外患”
– 内部错误(代码写砸了):比如把`print`拼成`pront`。这类错误属于“家丑”,应该在开发阶段就消灭干净,千万别让用户看到你的代码在裸奔。
– 外部风险(世界太复杂):用户手滑输错了、文件突然失踪、网络抽风……哪怕你是代码界的福尔摩斯也防不住。这时候**异常处理**就是你的急救箱:
– 在关键路口设检查点(比如文件读取前加`os.path.exists`)。
– 给用户恰到好处的提示,比如“您要找的‘减肥食谱.txt’可能被冰箱里的蛋糕吃掉了”,比冷冰冰的`FileNotFoundError`更有人情味。
经验之谈:错误处理的“三明治法则”
1. 顶层面包:用户界面层——用人类语言说人话(比如“无法连接网络,请检查你的WiFi是否在蹭邻居的”)。
2. 中间馅料:逻辑层——悄悄记录技术细节(debug日志里写`errno 11004`)。
3. 底层面包:底层代码——该崩溃时就崩溃,别让bug假装没事(比如`assert`验证关键数据)。
最后记住:最好的错误报告是让用户觉得“这程序真懂我”——该认错时诚恳,该闭嘴时优雅。
就像一个好的段子手,知道什么时候该抖包袱,什么时候该假装严肃。
Python编程练习:从异常处理到文本分析
练习 10.6:数字捉迷藏游戏

让我们玩个游戏:让用户输入两个数字,然后我们把它们相加。
听起来简单?
但有个小陷阱——用户可能会调皮地输入文字而不是数字!
print("欢迎来到数字加法游戏!")
print("请给我两个数字,我会把它们相加~")
try:
num1 = float(input("请输入第一个数字: "))
num2 = float(input("请输入第二个数字: "))
print(f"结果是: {num1 + num2}")
except ValueError:
print("哎呀!你确定输入的是数字吗?别逗我玩啦!")
测试建议:
1. 先乖乖输入两个数字
2. 然后调皮地输入”香蕉”和”苹果”
3. 观察程序如何优雅地处理你的恶作剧
练习 10.7:永不言弃的计算器
上次的游戏只能玩一次?太没意思了!
让我们改进一下,让用户可以无限次尝试,直到他们输入正确的数字为止。
print("这次我不会轻易放弃你!")
while True:
try:
num1 = float(input("第一个数字 (输入q退出): "))
if num1 == 'q':
break
num2 = float(input("第二个数字: "))
print(f"结果是: {num1 + num2}")
break # 成功就退出循环
except ValueError:
print("亲爱的用户,数字!我说的是数字!不是你的购物清单...")
练习 10.8:宠物大阅兵
现在让我们玩点不一样的——读取猫猫狗狗的名字文件!
filenames = ['cats.txt', 'dogs.txt']
for filename in filenames:
try:
with open(filename) as f:
contents = f.read()
print(f"
{filename}中的宠物明星:")
print(contents)
except FileNotFoundError:
print(f"糟糕!找不到{filename}文件,是不是宠物们集体出逃了?")
测试小技巧:
1. 创建cats.txt和dogs.txt文件
2. 在cats.txt中写入:Whiskers
Mittens
Snowball
3. 在dogs.txt中写入:Buddy
Max
Bella
4. 故意删掉一个文件看看效果
练习 10.9:安静的宠物管理员

有时候,我们不想大惊小怪地报告文件丢失。
让我们做个安静的美男子/美女程序员:
filenames = ['cats.txt', 'dogs.txt']
for filename in filenames:
try:
with open(filename) as f:
contents = f.read()
print(f"
{filename}中的宠物:")
print(contents)
except FileNotFoundError:
pass # 嘘...我们什么都没看见
练习 10.10:单词侦探
现在来点高级的——统计名著中”the”这个词出现的频率!
def count_the_words(filename):
"""统计文件中'the'出现的次数"""
try:
with open(filename, encoding='utf-8') as f:
contents = f.read()
except FileNotFoundError:
print(f"找不到{filename}文件!")
else:
# 简单统计(会包含'there'等词)
the_count = contents.lower().count('the')
# 更精确的统计(带空格)
precise_count = contents.lower().count('the ')
print(f"
在{filename}中:")
print(f"'the'出现次数(粗略): {the_count}")
print(f"'the'出现次数(精确): {precise_count}")
# 使用示例
count_the_words('pride_and_prejudice.txt')
专业提示:
1. 从古登堡计划下载你喜欢的书籍文本
2. 尝试比较不同书籍中”the”的使用频率
3. 进阶挑战:统计其他常见单词如”and”, “of”等
这些练习不仅教会你处理异常,还能让你玩转文件操作和文本分析!
记住,编程就像驯养宠物——需要耐心和正确的技巧。现在,去征服那些调皮的异常和文本吧!
10.4 数据存储:让你的程序拥有”记忆”
想象一下,你开发了一个超棒的程序,用户玩得不亦乐乎,设置了各种个性化选项——然后一关机,所有设置烟消云散!
这就像你刚写完一篇绝世好文,电脑突然蓝屏还没保存一样令人崩溃。
别担心,Python 的 `json` 模块就是你的”记忆面包”(哆啦A梦粉丝懂的)。
它能把你程序里的字典、列表等数据结构变成一种叫 JSON 的通用格式,存进文件里。
下次用户打开程序时,这些数据就能像魔法一样重新加载回来!
为什么 JSON 是程序员的”通用语”?
– 跨语言交流:虽然名字里带着”JavaScript”,但 JSON 早就成了编程界的”世界语”。
Python、Java、C#…几乎所有主流语言都能读写它
– 轻量如羽毛:不像某些复杂的数据格式,JSON 文件就是纯文本,人类能看懂,机器解析起来也飞快
– 语法超简单:如果你会写 Python 字典,那基本上已经掌握 JSON 了(悄悄说:它们长得就像双胞胎)
举个栗子🌰
假设你的游戏要记录玩家成就:
import json
player_data = {
"name": "菜鸟勇士",
"level": 99,
"skills": ["卖萌", "装死", "一键连招"],
"hidden_achievements": True
}
# 存档操作(建议配合"Ctrl+S"肌肉记忆使用)
with open('player.json', 'w') as f:
json.dump(player_data, f) # 这行代码相当于给数据拍了张照片
# 读档操作(适用于玩家杀回来的场景)
with open('player.json') as f:
loaded_data = json.load(f) # 叮!记忆恢复术!
冷知识:JSON 文件甚至可以用来做跨程序”漂流瓶”——用 Python 存个彩蛋,让同事用 Java 程序打开,说不定能触发一段办公室友情(或战争)

下次当你的程序需要记住些什么时,别忘了 json 这个低调的”记忆大师”。
它可能不会说”Always”,但确实能让数据”Until the end of the program” 😉




















暂无评论内容