今天做 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 模型
当错误出现在某个函数里时,不一定是这个函数本身有问题。先确认它拿到的数据是否符合预期。
这类“上游数据错误 → 下游出现看似无关的异常”在实际开发中非常常见。