今天做 CLI Todo 时遇到了一个很典型的 Bug。
删除任务时,我原本应该保存整个任务列表:
save_tasks(tasks)
却误写成了:
save_tasks(task)
结果 tasks.json 从原来的列表:
[
{
"id": 5,
"title": "学习Docker",
"done": true
}
]
变成了一个字典:
{
"id": 5,
"title": "学习Docker",
"done": true
}
之后程序执行:
for task in tasks:
if task["id"] == task_id:
由于 tasks 已经变成字典,遍历它得到的是 "id"、"title"、"done" 这些字符串,而不是任务字典,因此最终出现:
TypeError: string indices must be integers
这次 Debug 学到的东西
看到 traceback 后,不应该只盯着最后一行。
应该沿着调用链检查:
TypeError
↓
find_task()
↓
tasks 的类型不对
↓
检查 tasks.json
↓
发现数据结构已经被破坏
↓
继续向上找写入数据的地方
↓
发现 save_tasks(task) 写错
真正的问题不是 find_task(),而是上游写入的数据结构已经发生了变化。
一个简单的 Debug 模型
当错误出现在某个函数里时,不一定是这个函数本身有问题。先确认它拿到的数据是否符合预期。
这类"上游数据错误 → 下游出现看似无关的异常"在实际开发中非常常见。