javascript 错误处理关键在于分层防御:对高风险操作(json解析、深层属性访问、dom操作、第三方库调用)主动 try/catch;异步错误需用 .catch() 或 async/await 中 try/catch;配合 window.onerror 和 window.onunhandledrejection 全局兜底;辅以 strict 模式、typescript、eslint 和输入校验提前预防。

JavaScript 中避免因缺少错误处理导致程序意外终止,关键不是“堵住所有错误”,而是建立分层、有意识的防御机制。错误无法完全消除,但可以控制它的影响范围和表现方式。
对高风险操作主动加 try/catch
不是所有代码都需要包裹,只针对明确可能抛错的场景:
- 解析用户输入的 JSON:用
JSON.parse()前必须加 try/catch,非法字符串会直接中断执行 - 访问深层嵌套对象属性:如
data.user.profile.name,可先用可选链?.,再配合 try/catch 捕获意外 - DOM 查询与操作:如
document.querySelector('.btn')返回 null 后调用.addEventListener()会报 TypeError - 调用第三方库方法:文档注明“可能抛出异常”的接口,务必做兜底
异步错误不能靠同步 try/catch 解决
Promise 拒绝(reject)和 async/await 抛出的错误,需对应处理:
- 使用
.catch()处理 Promise 链中的错误:fetch(url).then(...).catch(e => console.error(e)) - 在 async 函数中用 try/catch 包裹 await 表达式:
try { const res = await fetch(url); } catch (e) { /* 处理网络失败 */ } - 避免遗漏未 await 的 Promise:定时器、事件回调里发起的 fetch 若没 await 也没 catch,会变成 unhandled rejection
设置全局兜底,捕获漏网之鱼
局部处理总有遗漏,靠两个全局监听做最后一道防线:
-
window.onerror:捕获同步脚本错误、资源加载失败(如 JS 文件 404)、语法错误等 -
window.onunhandledrejection:捕获未被 catch 的 Promise 拒绝,比如忘记处理的 fetch 错误或 setTimeout 中抛出的异常 - 两者都建议上报关键信息:错误消息、堆栈、当前 URL、时间戳,便于线上问题定位
提前预防比事后补救更有效
很多错误其实在运行前就能规避:
- 启用
"use strict":让隐式全局变量、重复参数等潜在问题提前报错 - 用 TypeScript 或 JSDoc 做类型提示:减少
undefined.xxx类型错误 - 配置 ESLint 规则(如
no-unsafe-finally、no-empty、eqeqeq):在开发阶段拦截常见陷阱 - 对用户输入、接口返回做基础校验:比如检查是否为有效数字、是否为空对象,而不是直接访问属性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











