JavaScript错误处理需区分同步与异步:同步用try...catch,异步Promise优先用.catch()或await+try...catch;JSON.parse等同步操作必须try包裹,fetch等需配合await或链式.catch(),未捕获的rejection触发unhandledrejection。

JavaScript错误处理的核心在于区分同步和异步场景:同步错误用 try...catch,异步错误(尤其是 Promise 链)优先用 .catch() 或 await + try...catch,两者不是互斥,而是分工明确。
同步代码必须用 try catch
函数调用、对象属性访问、JSON.parse 等可能立即抛出错误的操作,只能被 try...catch 捕获。Promise 构造器内部的同步错误(比如在 new Promise((resolve, reject) => { throw new Error('sync') }) 中)也会被自动转为 rejected 状态,但不触发外层 try...catch —— 除非你在 Promise 外面包一层。
- 直接写
JSON.parse('{invalid}')必须放在try块里,否则脚本中断 -
obj?.unknown.prop是可选链,不会报错;但obj.unknown.prop会触发TypeError,需try...catch
Promise 链推荐用 .catch() 或 await + try catch
基于 Promise 的异步操作(如 fetch、axios.get)不适用普通 try...catch 包裹,除非配合 await。单独写 try { fetch(...) } catch(e) { } 不会捕获网络失败或 404,因为 fetch 本身不抛异常(它返回一个 resolve 的 Promise,即使 HTTP 状态码是 500)。
- 使用
.then().catch():适合纯 Promise 风格链式调用,.catch()能捕获前面任意.then中的同步错误和 Promise rejection - 使用
async/await+try...catch:语义更清晰,可 await 多个 Promise,且catch能捕获await表达式 reject 的值(等价于.catch())
不要混用或遗漏 catch 导致静默失败
未处理的 Promise rejection 会触发 unhandledrejection 事件(控制台报黄警告),长期忽略可能导致逻辑断裂却无提示。常见错误包括:
立即学习“Java免费学习笔记(深入)”;
- 只写
.then(success),没写.catch()→ 错误被吞掉 - 在
async函数中await promise却没包try...catch→ rejection 会向上冒泡,最终可能变成 unhandled - 多个并行 Promise(如
Promise.all([p1, p2]))失败时,整个 Promise 被 reject,需统一处理,不能只依赖单个.catch()
实际组合建议:分层捕获 + 统一兜底
业务代码中常采用“局部捕获 + 全局监听”策略:
- 接口请求层:每个
await api.login()配try...catch,做具体错误提示(如“密码错误”) - 组件层:对用户可感知的操作(提交表单、刷新列表)包裹
try...catch,避免页面卡死 - 应用层:注册
window.addEventListener('unhandledrejection', ...)记录日志,防止遗漏
不复杂但容易忽略










