做东西的时候,报错是日常,不是审判。报错是程序在告诉你“我卡在哪了”,读懂它,比让 AI “再修一下”快得多。
这本锦囊一共十二招,只做一件事:让你出问题时知道先干什么。前四招最常用,遇到问题先试它们;后面几招留给“试了还不行”的时候。
一条底线贯穿全文:“AI 说修好了”不算修好。你亲手按原来的步骤再走一遍、看到正确结果,才算。
遇到什么,先读哪一节
- 终端或控制台里有红色报错招 1 直接丢错误还不行再用招 6 沿数据流审查
- 页面白屏、错位、按钮被挡住招 2 截图定位还不行再用招 3 打印变量
- 能运行,但数字、列表、状态不对招 3 打印变量还不行再用招 7 假设验证
- 刚让 AI 改完,心里没底招 4 带目标自查还不行再用招 8 加测试
- 登录、保存时好时坏招 5 查日志还不行再用招 7 假设验证
- 前端和后端“对不上”招 6 沿数据流审查还不行再用招 3 打印变量
- 同一个问题修了好几次还在打转招 7 假设验证还不行再用招 10 换个视角
- 修好的问题过几天又回来了招 8 加测试还不行再用招 7 假设验证
- 不确定框架或库本来该怎么用招 9 查官方资料还不行再用招 10 换个视角
- 越改越乱,好的坏的混在一起招 11 恢复控制还不行再用招 12 补规格
- 每次做出来都“不是我要的”招 12 补规格还不行再用招 4 带目标自查
想先看一遍完整过程,跳到 三个示例。
全书一图
每一格都能点,直接跳到那一节。
问题卡:先把问题说清楚
读完你能:
- 填好问题卡,一次把现象、步骤、预期和实际说清
大多数来回拉扯,是因为 AI 不知道你做了什么、看到了什么、想要什么。花一分钟填这张卡,后面每一招都能直接用。
| 栏目 | 填什么 | 例子 |
|---|---|---|
| 我在做 | 哪个项目、哪个页面或功能 | 记账小网页的“新增账目”弹窗 |
| 在哪里跑 | 本地还是线上;浏览器;电脑或手机 | 本地,Chrome,电脑 |
| 怎么复现 | 一步一步的操作 | 打开首页 → 点“记一笔” → 填金额 → 点保存 |
| 我期望 | 应该发生什么 | 列表里多出一条 |
| 实际发生 | 看到了什么,报错原文 | 弹窗关了,列表没变,控制台无报错 |
| 多久一次 | 每次都这样,还是偶尔 | 每次 |
| 最近改了啥 | 出问题前做过的改动;不知道就写“不确定” | 刚让 AI 把弹窗换成新组件 |
| 已经试过 | 做了什么、结果如何 | 刷新过,没用 |
在产品里,这张卡是一个表单:前五栏必填,后三栏选填;填完点“复制”,得到下面这段文字,直接贴给 AI。
我在做: 在哪里跑: 复现步骤:1. 2. 3. 我期望: 实际发生: 多久一次: 最近改了: 已经试过: 请先帮我判断问题大概出在哪一层,给我一个最小的检查步骤,确认后再改代码。
把方括号里的内容换成你的情况
贴出去之前,先脱敏。密码、密钥、登录令牌(token)、Cookie、数据库连接地址换成 ***。密钥不要贴给 AI,也不要提交进代码仓库。截图时顺手看看地址栏和旁边的窗口有没有露出私人信息。
一、先让问题露出来(最常用)
1直接丢错误
读完你能:
- 把完整报错原文连同触发步骤一起交给 AI
什么时候用终端、浏览器控制台或编辑器里出现了报错。
怎么做把报错复制完整,别只截最后一行。最有用的是第一行(错误类型和说明)和紧跟着的几行位置信息(哪个文件、第几行)。再补一句“我做了什么之后出现的”。同一行重复几十遍的,留一两行就够。
我在 做了 之后出现这个报错: 先告诉我它大概出在哪一层、是什么意思,给我一个最小的检查步骤。 确认原因后再改,别一上来就装新包或改配置。
把方括号里的内容换成你的情况
做到这样算完成原来那条命令或那个操作重新执行一次,不再报错,结果也对。只是“报错消失了”还不够,要看功能本身有没有做到。
2截图定位
读完你能:
- 用截图加文字标出哪里不对,而不是只说“乱了”
什么时候用页面长得不对,文字说不清楚。比如错位、遮挡、手机上挤成一团、白屏。
怎么做截图时在图上圈出问题区域,再补三件事:窗口多宽(电脑还是手机)、你做了什么、本来应该什么样。白屏这种截图里什么都没有的,要同时打开浏览器的开发者工具(Chrome 里 Windows 按 F12,Mac 按 Cmd+Option+I),把 Console(控制台)里的红字一起给 AI。Chrome DevTools:Console 概览
这是 上的 ,我圈出的地方有问题。 我做了 ,期望 ,实际 。 控制台里的报错是: 先判断是布局、内容太长还是状态没切换,改完后在手机宽度和电脑宽度都检查一遍。
把方括号里的内容换成你的情况
做到这样算完成同样的操作在手机和电脑宽度下都正常,文字变长、放大页面也不再挤压或遮挡。
3打印变量
读完你能:
- 在可疑位置打印变量,确认数据在哪一步变了
什么时候用能运行、不报错,但结果不对。金额算错、列表是空的、按钮点了走错分支。
怎么做在怀疑的位置把关键变量的值和类型一起打印出来,对照“我以为它是什么”。例如 console.log('价格', price, typeof price),打开浏览器控制台就能看到。常见坑:"99" + 1 得到的是字符串 "991",不是数字 100,因为其中一边是文字。一次只打印几处,打印太多反而看不出哪里断了。更进一步可以用断点暂停代码,直接看每个变量的值。Chrome DevTools:调试 JavaScript
的结果不对:输入 ,期望 ,实际 。 请在 加几行打印,输出关键变量的值和类型,标清楚是哪一步打印的。 我跑一次把输出贴给你,我们一起找出第一次和预期不一样的那一步,再改。 修好后把临时打印删掉。
把方括号里的内容换成你的情况
做到这样算完成你能指出“从第几步开始值不对”,修好后原来的输入得到正确结果,临时打印已删除。
4让 AI 带着目标自查
读完你能:
- 给 AI 一个明确目标,让它逐项自查并报告证据
什么时候用刚让 AI 改完一段,还没发现具体问题,但心里没底。
怎么做只说“你再检查一遍”,AI 往往回一句“没问题”。要给它一个目标:这次改了什么、用户会怎么操作、怎样才算对。让它顺着用户操作走一遍,分清“确定是问题”和“只是猜测”。不要要求“至少找出五个问题”,它会为了凑数编出问题来。
你刚改了 。请按用户操作走一遍:,应该看到 。 检查这次改动和直接调用它的代码,列出可能出错的地方和对应的代码位置, 分清“确定是问题”和“只是怀疑”。确定的先做最小修复,怀疑的告诉我怎么验证。
把方括号里的内容换成你的情况
做到这样算完成你拿到了一份有代码位置的问题清单,或者 AI 说明了它具体检查了哪些路径。AI 说“没发现问题”但你实际操作还是不对,就换招 1、招 2、招 3,拿证据说话,别反复让它“更认真一点”。
二、顺着证据缩小范围
5查日志
读完你能:
- 按时间找到出错那一刻的日志
什么时候用问题时有时无,或者要经过好几步(登录、保存、上传),不知道断在哪一步。
怎么做先看已有的输出,浏览器看 Console 和 Network(网络)面板,后端看终端输出。Network 面板里每一行是一个请求,Status 列是状态码,点开能看请求发了什么、服务器回了什么。Chrome DevTools:检查网络活动 不够再让 AI 在每一步加一行日志,记“到了哪一步、状态是什么”。日志里不要写密码、令牌、Cookie、连接地址。OWASP 日志备忘单
有时成功有时失败。请在这条流程的每一步加一行日志: ,只记步骤名、状态和数量, 不要打印密码、token 或 Cookie。我复现一次把日志贴给你,你告诉我断在哪一步。 查完把临时日志删掉。
把方括号里的内容换成你的情况
做到这样算完成你能说出“前几步都正常,从某一步开始不对”。注意:某一步没有日志,也可能是代码根本没走到那里,不一定是那一步坏了。
6沿数据流审查
读完你能:
- 沿着数据从输入走到输出,定位出错的那一段
什么时候用前端、后端、数据库各自看都没错,放在一起就不对。比如后端返回的是 products,前端读的是 items。
怎么做让 AI 沿着失败的那次操作,从头走到尾:用户输入 → 前端整理 → 发出请求 → 后端接收 → 读写数据 → 返回 → 页面显示。每一段写清“收到什么、交出什么”,重点看相邻两段的字段名、类型、有没有空值。
的结果不对。请沿着这次操作从头追到尾: 用户输入、前端请求、后端处理、数据读写、返回内容、页面显示, 每一段写出收到什么、交出什么,找出第一处前后对不上的地方。 只修造成问题的那一处,其他想重构的地方单独列给我。
把方括号里的内容换成你的情况
做到这样算完成找到了那处“对不上”,改完后原来的操作能走通。不能靠删掉检查、把类型改宽松、或让后端假装成功来“消灭”报错。
7假设验证
读完你能:
- 一次只验证一个假设,并记下结果
什么时候用修了好几次还在打转,或者问题偶发、原因好像不止一个。
怎么做先停手,别再叠改动。把“我觉得可能是……”一条条写下来,每条配一个能证明它错的小实验,从最容易验证的开始,一次只改一个条件。实验结果推翻了哪条就划掉哪条。找到原因后,只做能消除它的最小修改。
| 假设 | 支持它的证据 | 怎么证明它错 | 结果 |
|---|---|---|---|
| 请求地址写错了 | Network 里是 404 | 对比请求地址和后端路由 | 排除/保留 |
| 数据还没回来页面就渲染了 | 刷新后偶尔正常 | 打印数据到达和渲染的先后 | 排除/保留 |
这个问题反复出现:。先别改代码,帮我列出几个可能的原因, 每个写上:现有证据、怎样证明它不对、实验的预期结果。 从最容易验证的开始,一次只改一个条件,把结果告诉我再决定下一步。 确认原因后做最小修改,并解释为什么它能解决问题。
把方括号里的内容换成你的情况
做到这样算完成有一条假设被实验证实,其他被排除;修复后问题消失,你能用一句话说出原因。证实不了就写“尚未确认”,别把猜测当结论。
三、防止再犯,或者换条路(进阶,新手可以先跳过)
8加测试
读完你能:
- 为修好的问题补一个测试,防止它再回来
什么时候用同一个问题修好又回来;或者这块很关键,比如金额计算、登录、谁能看到谁的数据。
怎么做先写一个能“重现问题”的测试,它此刻应该失败;再修代码,直到它通过。以后每次改动都跑一遍,问题回来会第一时间被发现。测试检查用户看得到的结果(刷新后数据还在、别的账号看不到),而不是“某个函数被调用了一次”。Playwright 最佳实践
已经出现过不止一次。请先写一个测试重现它:,期望 。 先运行给我看它失败,再修代码,然后运行给我看它通过。 不要为了通过去改测试的期望,也不要跳过测试;用了模拟数据的地方请告诉我。
把方括号里的内容换成你的情况
做到这样算完成同一个测试,修之前失败、修之后通过,并且你亲眼看到了运行结果。
9查官方资料
读完你能:
- 对照官方文档和版本号,确认用法是否过时
什么时候用怀疑是框架、库或平台本身的用法问题,或者 AI 给的写法看着像旧版本的。
怎么做先告诉 AI 你用的是哪个版本(看项目里的 package.json 或依赖清单),让它优先查官方文档、迁移指南和官方问题追踪,不同版本的写法不能混着用。社区文章只当线索。
我在用 的 ,遇到 。 请先查官方文档,告诉我这个版本推荐的写法,附上出处链接。 区分官方说明和社区经验,再对比我现在的写法差在哪,给最小的改法。
把方括号里的内容换成你的情况
做到这样算完成你拿到了对应版本的官方出处,按它改完后问题消失。只找到相似案例的,先当成“待验证”。
10换个视角
读完你能:
- 卡住时换一个模型或请人看,带上已排除的项
什么时候用你和 AI 围着同一个猜测转了好几圈,已经有了问题卡和试过的实验。
怎么做换一个新对话、另一个 AI 工具或请同学看。关键是把材料交接清楚:问题卡、相关代码、已经排除了什么,让对方从头判断,不要被之前的猜测带跑。换视角是为了得到新的可验证假设,不是找一个“猜对的”。
请独立分析这个问题:。 相关代码:。已经排除:。 别管之前怎么修的,先给你自己的判断,再告诉我下一步该做哪个实验。 没法运行代码的话,请说明哪些只是推测。
把方括号里的内容换成你的情况
做到这样算完成拿到了一条之前没想到、而且能用实验验证的新思路。
11恢复控制
读完你能:
- 越改越乱时回到最后一个能用的存档
什么时候用越改越乱,改一个坏两个,已经说不清哪些改动是好的。
怎么做先存下现状,再回到最后一个正常的版本,从那里一步一步重来。前提是你平时有“存档”习惯(见“稳定做”锦囊的新手三招)。回去之前确认两件事:现在的改动里有没有值得留的;如果改过数据库结构,旧代码还能不能读新数据。代码能退回去,数据库里的数据不会自动跟着退。
这块越改越乱了。先别动文件,帮我列出:从上一个正常的存档到现在改了哪些地方, 哪些改动值得保留。然后先把现状存一份,再回到那个正常的存档, 告诉我会影响哪些文件,等我确认再执行。回去后我们一步一步重做,改一步验证一步。
做到这样算完成项目回到能正常运行的状态,值得留的改动没丢,你知道接下来按什么顺序重做。具体恢复方式见“稳定做”锦囊的“改坏了怎么恢复”。
12补规格
读完你能:
- 先写清“对”长什么样,再让 AI 按规格重做
什么时候用改了很多次都“不是我要的”,或者你和 AI 对“正确”的理解根本不一样。这时问题不在代码,在需求没说清。
怎么做停下来,写一页规格:用户怎么操作、看到什么;数据从哪来、存到哪;空数据、网断了、连点两下、没权限时分别怎样。确认后,列出和现有实现的差异,拆成小步一个个改。不必推倒重来,已经做对的部分保留。
改了好几次都不对,我怀疑是需求没说清楚。先别改代码, 帮我整理一页规格:用户怎么一步步操作、每一步看到什么、数据存在哪, 以及没数据、网络断了、连点两次、没权限时应该怎样。 我确认后,你列出现在的实现和它差在哪,拆成小步逐个改、逐个验证。
把方括号里的内容换成你的情况
做到这样算完成有一页你认可的规格,拿它能判断“这样对不对”;按它改完的功能逐条通过。
四、三个示例:从现象走到验证
下面三个都是示例,为了演示过程构造的,不是真实项目记录。
1页面打开是白屏
- 现象:让 AI 给记账页加了“按月筛选”,刷新后整页空白,终端里没有报错。
- 证据:用招 2,打开 Chrome 开发者工具的 Console,看到红字:
TypeError: Cannot read properties of undefined (reading 'map'),指向RecordList组件。 - 定位:用招 3,在
RecordList开头打印records,第一次输出是undefined,过一会儿才变成数组。说明数据还没从接口回来,页面就试图把它当列表用。 - 修复:让 AI 给
records一个空列表作为初始值,数据加载中显示“加载中”,接口失败时显示提示文字,而不是整页崩掉。 - 验证:刷新页面列表正常;在 Network 面板把网速调慢,能看到“加载中”再出现列表;让接口返回空数组,页面显示“还没有记录”。三种情况都不白屏才算修好。
2接口返回 404
- 现象:商品页一直显示“加载失败”。
- 证据:用招 5,在 Network 面板找到那条请求,Status 是
404,地址是/api/product。404 的意思是服务器找不到请求的资源。MDN:404 Not Found - 定位:用招 6,对比前端请求地址和后端路由,后端定义的是
/api/products,少了一个 s。也可以在终端直接请求一次,确认后端本身是好的:
# 在电脑终端运行;只读取,不修改任何文件。Windows PowerShell 里请写 curl.exe。端口换成你项目的实际端口
curl -i http://localhost:3000/api/products返回 200 和商品数据,说明后端没问题,问题在前端写的地址。
- 修复:把前端请求地址改成
/api/products,并让 AI 检查项目里还有没有别处用了旧地址。 - 验证:刷新商品页,Network 里那条请求变成
200,页面显示商品;再搜一遍代码,确认没有残留的/api/product。
3保存后刷新,数据没了
- 现象:新增一条待办,列表里出现了;一刷新,没了。
- 证据:用招 5,打开 Network 面板再保存一次,发现点“保存”时根本没有发出任何请求。
- 定位:用招 7 列两个假设。H1:数据只存在页面内存里,没发给后端。H2:发给了后端,但后端也只存在内存里,重启就丢。Network 里没有请求,H1 成立;H2 暂时不用查。
- 修复:让 AI 在保存时调用后端的新增接口,接口成功后再更新列表;失败时提示用户并保留输入内容。
- 验证:保存一次,Network 出现一条成功的请求;刷新页面,待办还在;关掉浏览器重新打开,还在;再重启一次本地服务,仍然还在(这一步顺便排除了 H2)。
调试报告模板
修完一个值得记的问题,留一份报告给队友,也给一个月后的自己。
问题: 环境: 复现步骤:1. 2. 3. 期望与实际: 原因: 排除过的: 改了什么: 怎么验证的: 还没验证的: 以后怎么避免:
把方括号里的内容换成你的情况
练一练:改写这三句话
先自己改一遍,再点开参考改法对照。
把这句话改清楚:“页面白屏了,帮我修。”
看参考改法
改法打开首页是一片白,控制台第一条红字贴在下面。先帮我判断是哪一行代码出错,给一个验证办法,确认后做最小修改,改完告诉我刷新后该看到什么。
差别补上了控制台原文,并要求先定位、再最小修改、最后验证。
把这句话改清楚:“数据有时候保存不上,不知道为啥。”
看参考改法
改法保存笔记大约十次失败一次,失败时接口返回 500,日志时间和请求编号贴在下面。帮我按时间线找出失败那次和成功那次的差别,一次只验证一个假设。
差别把“有时候”换成了频率、证据,以及一次只验证一个假设的办法。
把这句话改清楚:“越改越乱了,你再试试。”
看参考改法
改法我已经连续改了五次,问题更多了。先帮我回到最后一个能正常运行的存档,列出这五次改动里值得保留的部分,再按问题卡重新描述一遍问题。
差别先止损回到存档,再整理有用的改动,而不是继续猜着改。