javascript异步错误处理关键在于分层识别:语法错误发生在解析阶段,无法被catch捕获;网络错误(如failed to fetch)需try/catch捕获并判别;业务错误需主动检查response.ok或响应体字段,再抛出自定义异常统一处理。

JavaScript 中异步错误处理的关键,不在于“统一捕获”,而在于“分层识别”——网络错误、业务错误和语法错误根本不在同一层级,混淆它们会导致错误被掩盖或误判。
语法错误:根本不会走到异步环节
语法错误(SyntaxError)发生在代码解析阶段,浏览器或 Node.js 引擎在加载脚本时就直接报错并中断执行。它不可能出现在异步回调里,因为那段代码压根没被解析成功。
比如:
-
fetch('/api').then(() => { console.log('done'; });—— 缺少右括号,整个 JS 文件加载失败,控制台显示Uncaught SyntaxError,fetch 甚至没机会执行; - ES6 模块中写错 export 语法,模块加载失败,后续所有异步逻辑都不会触发。
所以,你在 catch 或 onRejected 里永远捕不到语法错误。它必须靠编辑器实时提示、构建工具(如 ESLint、TypeScript)或浏览器控制台顶部的红色报错来发现。
网络错误:请求发不出去或连接断开
网络错误(如 DNS 失败、请求超时、服务不可达、CORS 被拒、fetch 被中止)通常表现为 TypeError(如 TypeError: Failed to fetch)或 AbortError。它们属于运行时错误,但不是后端返回的 HTTP 错误码。
判断要点:
- 响应对象
response.ok === false不代表网络错误(那是 HTTP 层业务反馈); - 真正网络错误发生时,
fetch()会直接 reject,根本不会返回 response 对象; - 常见表现:控制台报
net::ERR_CONNECTION_REFUSED、TypeError: fetch failed、AbortError: The operation was aborted。
建议做法:用 try/catch 包裹 await fetch(),并在 catch 中检查 error.name 或 message 判断是否为网络异常。
业务错误:HTTP 成功但语义失败
业务错误指请求发出去了、也收到了响应(response.status 在 200–299 范围外,或响应体中含 { success: false, code: 'USER_NOT_FOUND' } 这类约定字段),属于应用逻辑层面的问题。
- 它不是 JavaScript 运行时错误,不会抛异常,需要你主动检查;
- 典型场景:401(未登录)、403(无权限)、404(资源不存在)、500(后端内部异常)、或自定义业务码(如
code: 1002表示余额不足); - 处理方式:拿到
response后,先判断!response.ok或解析 JSON 后检查data.code字段,再按业务规则 throw 自定义错误(如throw new BusinessError(data.message, data.code))。
这样就能把业务错误“升格”为可被上层 catch 统一处理的异常,和网络错误区分开。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











