JavaScript如何实现错误处理_JavaScript中try catch与Promise catch如何选择

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 的异步操作(如 fetchaxios.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', ...) 记录日志,防止遗漏

不复杂但容易忽略