代码报错怎么办?正确使用 AI 排查错误

写代码时遇到报错很正常。

真正容易让人卡住的,通常不是"出现了错误",而是下面这种情况:

  • 看不懂报错信息。
  • 把一句报错丢给 AI,得到一大堆不相关的建议。
  • 按 AI 的方法改完,错误还在,甚至出现了新问题。
  • 为了让错误消失不断改代码,最后连原来的逻辑也弄乱了。

很多人会这样问 AI:

text 复制代码
我的代码报错了,怎么解决?

这句话提供的信息太少。

AI 不知道你用的语言、框架、版本,也不知道错误发生在哪一步,更不知道你希望程序最终做什么。它只能根据有限信息猜测,答案自然容易泛泛而谈。

这一篇我们从零开始学习:代码报错后,怎样把关键信息交给 AI,让它真正帮助你缩小排查范围。

一、先建立一个正确认识:报错信息不是废话

初学者看到一长串红色报错,第一反应往往是直接复制最后一行去搜索。

但一条完整报错,通常已经包含了很多有价值的线索:

  • 错误类型。
  • 错误描述。
  • 出错文件。
  • 出错行号。
  • 函数调用路径,也就是错误是怎样一步步发生的。

例如下面这条 JavaScript 报错:

text 复制代码
TypeError: Cannot read properties of undefined (reading 'name')
    at renderUser (app.js:12:28)
    at app.js:20:1

它至少告诉了我们:

  • 错误类型是 TypeError
  • 程序尝试读取一个 undefined 值的 name 属性。
  • 首先应该检查 app.js 的第 12 行。
  • 错误发生在 renderUser 函数中。

所以,报错不是一段需要"删除"的红字,而是一份排查线索。

使用 AI 排查错误的第一步,不是立刻让它给修复代码,而是把错误现场保存完整。

二、为什么只发一句"这个报错怎么解决"通常没有用

假设你只把下面这句话发给 AI:

text 复制代码
TypeError: Cannot read properties of undefined 怎么解决?

AI 可能会给出很多可能性:

  • 检查变量是否初始化。
  • 使用可选链 ?.
  • 增加空值判断。
  • 检查接口返回数据。

这些建议不一定错,但它们只是通用方向,不是针对你项目的结论。

同一个 undefined 错误,可能由完全不同的问题造成:

  • 接口还没有返回数据,就开始渲染页面。
  • 属性名称写错了,例如把 userName 写成 name
  • 数组下标越界,取到了不存在的数据。
  • 函数调用时漏传了参数。
  • querySelector 没找到页面元素。
  • 异步请求失败,但代码没有处理失败结果。

如果上下文不足,AI 只能猜。

我们要做的不是让 AI "猜得更快",而是给它足够的信息,让它像协作开发中的同事一样分析问题。

三、向 AI 提供报错信息时,至少准备这 5 类上下文

不需要把整个项目都发给 AI。

大多数报错,只要提供与问题直接相关的信息,就足够开始排查。

1. 完整报错信息和调用栈

不要只截取最后一句错误描述。

尽量把控制台中的完整报错复制出来,尤其要保留:

  • 错误类型。
  • 错误信息。
  • 文件名和行号。
  • 调用栈。

例如:

text 复制代码
TypeError: Cannot read properties of undefined (reading 'name')
    at renderUser (app.js:12:28)
    at loadUser (app.js:18:3)

文件名和行号能帮助 AI 快速定位应该先看哪里;调用栈则能帮助它判断错误是从哪个函数传过来的。

2. 复现步骤

告诉 AI 错误在什么操作之后发生。

例如:

text 复制代码
复现步骤:
1. 打开用户列表页面。
2. 点击第一条用户数据。
3. 页面加载详情时,浏览器控制台报错。

如果错误不是每次都会发生,也要说明触发条件:

text 复制代码
只有用户没有填写昵称时才会报错。

这类信息可以明显减少无关猜测。

3. 报错位置附近的最小相关代码

不要一开始就粘贴几千行代码。

更有效的方式是:提供报错行前后几十行,以及调用这个函数的关键代码。

例如:

javascript 复制代码
function renderUser(user) {
  userName.textContent = user.profile.name;
}

fetch("/api/user/1")
  .then((response) => response.json())
  .then((data) => {
    renderUser(data);
  });

这段代码比"整个项目压缩包"更容易让 AI 聚焦问题。

如果错误与页面元素有关,还可以补充相关 HTML:

html 复制代码
<p id="userName"></p>

4. 运行环境和版本

同一段代码,在不同环境下可能有不同结果。

建议说明:

  • 使用的编程语言和版本。
  • 框架及版本。
  • Node.js、Python、Java 等运行时版本。
  • 包管理器。
  • 操作系统。
  • 是否刚升级过依赖或工具。

例如:

text 复制代码
运行环境:
- Windows 11
- Node.js 20.11
- Vue 3
- Vite 5
- npm 10

版本信息尤其重要。

比如 AI 按 Vue 3 写了代码,而你的项目实际仍在使用 Vue 2;或者某个库的 API 已经变化,旧教程中的写法无法直接运行。

5. 预期结果、实际结果和已尝试方案

这三项能帮助 AI 明确"什么才算修复成功"。

例如:

text 复制代码
预期结果:点击用户后展示用户昵称。
实际结果:页面没有显示昵称,控制台报错。
已尝试:我打印过 data,发现它有 id 和 userName 字段,但没有 profile 字段。

其中"已尝试方案"很重要。

它可以避免 AI 重复建议你已经做过的操作,也能让它知道你已经确认过哪些事实。

四、完整案例:用 AI 排查 undefined 报错

下面我们用一个常见案例,走一遍完整排查流程。

需求是:点击按钮后,显示当前用户的名字。

代码如下:

html 复制代码
<button id="showUserButton">显示用户</button>
<p id="userName"></p>

<script>
  const showUserButton = document.querySelector("#showUserButton");
  const userName = document.querySelector("#userName");

  function renderUser(user) {
    userName.textContent = user.profile.name;
  }

  showUserButton.addEventListener("click", () => {
    const currentUser = {
      id: 1,
      name: "小王"
    };

    renderUser(currentUser);
  });
</script>

点击按钮后,控制台出现:

text 复制代码
Uncaught TypeError: Cannot read properties of undefined (reading 'name')
    at renderUser (index.html:8:41)
    at HTMLButtonElement.<anonymous> (index.html:17:5)

不推荐的提问方式

text 复制代码
代码报 undefined 了,帮我改一下。

这种提问让 AI 直接输出修改后的代码,你可能知道"能改",却不知道错误为什么发生。

推荐的提问方式

text 复制代码
我在学习原生 JavaScript,下面代码点击按钮后报错。

完整报错:
Uncaught TypeError: Cannot read properties of undefined (reading 'name')
    at renderUser (index.html:8:41)
    at HTMLButtonElement.<anonymous> (index.html:17:5)

复现步骤:
点击"显示用户"按钮后立即报错。

相关代码:
[粘贴代码]

预期结果:
页面显示"小王"。

请按下面格式回答:
1. 用简单的话解释报错含义。
2. 指出最可能有问题的代码和原因。
3. 给出最小修改方案。
4. 说明如何验证修复是否正确。
不要重构无关代码。

AI 应该帮助我们得出的结论

renderUser 函数中,代码读取的是:

javascript 复制代码
user.profile.name

但实际传入的 currentUser 是:

javascript 复制代码
{
  id: 1,
  name: "小王"
}

对象中没有 profile 属性,因此 user.profile 的值是 undefined

继续读取 undefined.name,就会出现报错。

根据当前的数据结构,最小修改是:

javascript 复制代码
function renderUser(user) {
  userName.textContent = user.name;
}

修复后不能只看"红字消失"

修改后重新点击按钮,应该验证:

  • 页面是否显示"小王"。
  • 控制台是否不再报错。
  • 传入其他用户对象时是否仍能正常显示。
  • 如果用户没有名字,页面应该显示什么。

例如,可以再增加一个边界测试:

javascript 复制代码
const currentUser = {
  id: 2
};

此时需求需要进一步明确:没有名字时,页面是显示"未填写昵称",还是禁止展示?

这一步说明:修复一个运行错误,不代表所有业务问题都已经解决。

五、正确使用 AI 排错的 5 个步骤

遇到错误时,可以按下面的顺序操作。

text 复制代码
保存完整报错
  ↓
确定最小复现步骤
  ↓
整理相关代码和环境信息
  ↓
让 AI 解释、提出假设和排查顺序
  ↓
小范围修改并重新验证

第一步:先保存现场,不要急着乱改

看到报错后,先记录:

  • 完整错误信息。
  • 报错行号。
  • 当时执行的操作。
  • 当前输入数据。
  • 最近改过哪些代码或依赖。

如果一开始就连续修改很多地方,错误信息可能会变化,后续更难判断真正原因。

第二步:让 AI 先解释,再给修复建议

第一次提问时,可以要求 AI 先做分析:

text 复制代码
请先不要直接给完整修复代码。
请解释报错含义,列出 3 个最可能原因,
并按排查优先级告诉我应该检查什么。

这样做有两个好处:

  • 你能理解错误,不只是复制答案。
  • 你可以先验证 AI 的判断,再决定是否修改代码。

第三步:一次只改一个关键点

AI 有时会一次建议修改多个文件、升级依赖、重构函数。

对于初学者,更稳妥的做法是:

  1. 先确认最可能的原因。
  2. 只做一个最小改动。
  3. 重新运行并观察结果。
  4. 如果问题仍在,再进行下一步。

小范围修改更容易定位问题,也更容易撤回不合适的改动。

第四步:把新的结果继续告诉 AI

如果按建议修改后仍然报错,不要重新发一句"还是不行"。

应该补充新的结果:

text 复制代码
我按你的第 1 个方案修改后,原来的 TypeError 消失了,
但现在出现了下面的新错误:

[粘贴新报错]

当前代码如下:
[粘贴修改后的相关代码]

页面实际表现是:
[描述现象]

请基于这些新信息继续分析,不要重复之前已经排除的原因。

AI 排错是一个逐步缩小范围的过程。每次把新证据补充进去,答案才会越来越准确。

第五步:修复后做回归验证

报错消失后,至少检查:

  • 原来的操作是否恢复正常。
  • 与这段代码相关的其他功能是否受影响。
  • 空值、异常值、重复操作等边界场景是否正常。
  • 控制台是否出现新的警告或报错。

如果项目使用 Git,修复前先提交或暂存当前修改,会让你更安心地尝试 AI 给出的方案。

六、AI 给了很多建议,但问题仍没解决怎么办

这并不一定表示 AI 没有用,也不意味着你操作错了。

更常见的原因是:当前证据还不足,或者 AI 的某个假设不成立。

这时不要继续随机尝试所有方案,而是让排查回到"证据"。

你可以继续补充:

  • 关键变量的实际打印结果。
  • 接口的真实返回数据。
  • 相关配置文件。
  • 最小可复现代码。
  • 某个建议执行后的变化。

例如,AI 怀疑接口数据结构不对,可以先自己打印:

javascript 复制代码
console.log("接口返回数据:", data);

然后把真实输出发给 AI:

text 复制代码
我打印后的实际数据如下:
{
  "id": 1,
  "userName": "小王"
}

请根据这个真实数据重新判断,
并说明应该修改前端字段名,还是修改接口返回结构。

注意:console.log 是为了确认事实,不是为了在代码里永久留下调试语句。问题修复后,应清理不再需要的调试输出。

七、这些敏感信息不要直接发给 AI

为了排错,我们需要提供上下文,但不代表可以把所有内容原样发送。

以下信息应当删除、替换或打码:

  • API Key、Access Token、密钥和密码。
  • Cookie、登录凭证和会话信息。
  • 用户手机号、身份证号、邮箱和地址。
  • 生产环境数据库连接信息。
  • 公司内部域名、服务器地址和未公开业务数据。
  • 完整的生产日志和真实用户数据。

例如,下面这样的连接字符串不能直接粘贴:

text 复制代码
mysql://admin:真实密码@生产服务器地址:3306/order_db

可以替换为:

text 复制代码
mysql://<username>:<password>@<host>:3306/<database>

排错需要的是结构和现象,不是敏感凭证本身。

八、可直接复用的 AI 排错 Prompt 模板

遇到报错时,可以复制下面模板,再把方括号中的内容补充完整:

text 复制代码
我在开发一个 [项目类型,例如 Vue 3 待办事项页面] 时遇到报错,
请帮我分析排查思路。

运行环境:
- 操作系统:[例如 macOS]
- 语言/运行时及版本:[例如 Node.js 20]
- 框架及版本:[例如 Vue 3 + Vite]
- 包管理器:[例如 npm]

复现步骤:
1. [操作步骤 1]
2. [操作步骤 2]
3. [出现错误的操作]

完整报错:
[粘贴完整报错和调用栈]

相关代码:
[粘贴报错行附近的最小相关代码]

预期结果:
[应该发生什么]

实际结果:
[实际发生什么]

我已经尝试过:
[已做过的排查或修改]

请按以下顺序回答:
1. 用通俗语言解释这条报错。
2. 列出最可能的原因,并按优先级排序。
3. 给出每个原因的验证方法。
4. 给出最小修改方案,并解释修改原因。
5. 告诉我修复后应该测试哪些场景。

约束:
- 不要修改无关代码。
- 如果信息不足,请明确告诉我还需要补充什么。
- 不要建议我粘贴密钥、Token、Cookie 或真实用户数据。

这份模板的重点不是"写得很长",而是让 AI 获得判断问题所需的关键信息。

九、报错修复后的复盘清单

每次解决一个错误后,不妨花 2 分钟做个小复盘:

  • 这条报错的真正原因是什么?
  • 我是从哪一条线索定位到它的?
  • 下次遇到同类错误,应该先检查哪里?
  • AI 的哪条建议有效,哪条只是猜测?
  • 这次是否需要补充测试、校验或文档?

长期坚持下来,你会发现自己越来越能读懂报错,也越来越知道该怎样向 AI 提问。

AI 的价值不只是"替你改一行代码",更重要的是帮助你建立更清晰的排查思路。

总结

  • 报错信息、行号和调用栈是重要线索,不要只复制最后一句错误。
  • 向 AI 提问时,至少提供完整报错、复现步骤、相关代码、运行环境和预期结果。
  • 先让 AI 解释错误和给出排查顺序,再决定是否修改代码。
  • 每次只做一个最小改动,修改后立即重新运行验证。
  • AI 的建议需要用真实输出和测试结果验证,不能盲目照搬。
  • 提供上下文时要注意隐私,密钥、Token、Cookie 和生产数据必须脱敏。

当你能清楚地描述错误现场时,AI 才能从"泛泛的问答工具",变成真正帮你缩小排查范围的编程助手。

下一篇我们来做一周总结:

《一周总结:把 AI 当助手,而不是答案机器》


✍坚持原创,求关注,点赞,收藏

相关推荐
ClouGence1 小时前
自动化测试实战:手把手教你用 AI Agent 实现版本打包自动化
人工智能·ai编程·测试
Patrick_Wilson2 小时前
当执行不再稀缺:AI Agent 时代的技术判断力
人工智能·架构·ai编程
梅头脑2 小时前
传统开发规范在AI项目上全废了——做了PrismAI一年,我理出了这套10条红线+11领域规范的三层金字塔
ai编程
leeyi2 小时前
Langfuse 集成源码:batch 协议、media 上传与 mock 测试(第89篇-E75)
llm·aigc·agent
菜狗本狗2 小时前
我用 Skill 只花了10 分钟就写了这篇博客|Skill新手入门指南
ai编程
k4m7v2pz2 小时前
Swift Package Manager 在 macOS 26 上的三个编译错误排查指南
macos·spm·ai编程·xcode·swift·命令行工具
起个名字好难啊这也被占用了2 小时前
Vite插件开发实战AI提交前审查代码坏味道
人工智能·ai编程
Code额2 小时前
Python 连接 DeepSeek API,OpenAI 对话方式总结
后端·python·ai·ai编程
颜进强2 小时前
14 - OpenSpec 老页面改造骨架:定位 + 增量 + 回归三件套
前端·后端·ai编程