登录

03第 3 本不怕错

不怕错调试策略

给刚开始用 AI 做网页的同学:看现象选招,把问题说清楚,从报错一路走到修好并验证。

核对于 2026-09-26

学完你能

  • 看现象选招:白屏、报错、数据不对,各先用哪一招
  • 把问题写成一张问题卡,交给 AI 就能开始查
  • 修完亲手验证,而不是相信“已经修好了”
想快点翻完,可以切到速查版
招
12招
段可复制话术
14段可复制话术
个完整示例
3个完整示例
道改写题
3道改写题

做东西的时候,报错是日常,不是审判。报错是程序在告诉你“我卡在哪了”,读懂它,比让 AI “再修一下”快得多。

这本锦囊一共十二招,只做一件事:让你出问题时知道先干什么。前四招最常用,遇到问题先试它们;后面几招留给“试了还不行”的时候。

一条底线贯穿全文:“AI 说修好了”不算修好。你亲手按原来的步骤再走一遍、看到正确结果,才算。

遇到什么,先读哪一节

  1. 终端或控制台里有红色报错招 1 直接丢错误还不行再用招 6 沿数据流审查
  2. 页面白屏、错位、按钮被挡住招 2 截图定位还不行再用招 3 打印变量
  3. 能运行,但数字、列表、状态不对招 3 打印变量还不行再用招 7 假设验证
  4. 刚让 AI 改完,心里没底招 4 带目标自查还不行再用招 8 加测试
  5. 登录、保存时好时坏招 5 查日志还不行再用招 7 假设验证
  6. 前端和后端“对不上”招 6 沿数据流审查还不行再用招 3 打印变量
  7. 同一个问题修了好几次还在打转招 7 假设验证还不行再用招 10 换个视角
  8. 修好的问题过几天又回来了招 8 加测试还不行再用招 7 假设验证
  9. 不确定框架或库本来该怎么用招 9 查官方资料还不行再用招 10 换个视角
  10. 越改越乱,好的坏的混在一起招 11 恢复控制还不行再用招 12 补规格
  11. 每次做出来都“不是我要的”招 12 补规格还不行再用招 4 带目标自查

想先看一遍完整过程,跳到 三个示例。

全书一图

每一格都能点,直接跳到那一节。

  1. 1问题卡:先把问题说清楚
  2. 2先让问题露出来(最常用)4
    1. 1直接丢错误
    2. 2截图定位
    3. 3打印变量
    4. 4让 AI 带着目标自查
  3. 3顺着证据缩小范围3
    1. 5查日志
    2. 6沿数据流审查
    3. 7假设验证
  4. 4防止再犯,或者换条路(进阶,新手可以先跳过)5
    1. 8加测试
    2. 9查官方资料
    3. 10换个视角
    4. 11恢复控制
    5. 12补规格
  5. 5三个示例:从现象走到验证3
    1. 1页面打开是白屏
    2. 2接口返回 404
    3. 3保存后刷新,数据没了
  6. 6调试报告模板

问题卡:先把问题说清楚

读完你能:

  • 填好问题卡,一次把现象、步骤、预期和实际说清

大多数来回拉扯,是因为 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. 期望与实际: 原因: 排除过的: 改了什么: 怎么验证的: 还没验证的: 以后怎么避免:

把方括号里的内容换成你的情况

练一练:改写这三句话

先自己改一遍,再点开参考改法对照。

  1. 把这句话改清楚:“页面白屏了,帮我修。”

    看参考改法

    改法打开首页是一片白,控制台第一条红字贴在下面。先帮我判断是哪一行代码出错,给一个验证办法,确认后做最小修改,改完告诉我刷新后该看到什么。

    差别补上了控制台原文,并要求先定位、再最小修改、最后验证。

  2. 把这句话改清楚:“数据有时候保存不上,不知道为啥。”

    看参考改法

    改法保存笔记大约十次失败一次,失败时接口返回 500,日志时间和请求编号贴在下面。帮我按时间线找出失败那次和成功那次的差别,一次只验证一个假设。

    差别把“有时候”换成了频率、证据,以及一次只验证一个假设的办法。

  3. 把这句话改清楚:“越改越乱了,你再试试。”

    看参考改法

    改法我已经连续改了五次,问题更多了。先帮我回到最后一个能正常运行的存档,列出这五次改动里值得保留的部分,再按问题卡重新描述一遍问题。

    差别先止损回到存档,再整理有用的改动,而不是继续猜着改。