try-catch 无法直接捕获异步错误,需确保作用域覆盖异步错误源:async/await 中用 try 包裹 await;promise 链用 .catch() 或 await 后 try;回调中需手动 try-catch 并传递错误;顶层应设错误出口。

try-catch 无法直接捕获异步操作中抛出的错误,除非它被正确包裹在 Promise 链或 async/await 的作用域内。关键不是“放在哪里”,而是“作用域是否覆盖异步错误源”。
async/await 函数内部:用 try-catch 包裹 await 表达式
这是最直观、推荐的方式。await 会将 Promise 拒绝(reject)转换为同步抛出的异常,因此 try-catch 能自然捕获。
- 把 await 写在 try 块里,而不是整个函数体外
- 避免只 try 外层调用,却不 await 内部异步逻辑(那样 catch 不生效)
- 示例:async function fetchUser() { try { const res = await fetch('/api/user'); if (!res.ok) throw new Error('Network failed'); return await res.json(); } catch (err) { console.error('Fetch error:', err); } }
Promise 链中:优先用 .catch(),而非外层 try-catch
直接对 Promise 实例使用 try-catch 是无效的——Promise 构造函数内的同步错误可被捕获,但异步 reject 不会触发外层 catch。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 在 .then() 后接 .catch(),或在链末尾统一处理
- 若坚持用 try-catch,需确保整个链被 await(即该 Promise 已启动并等待完成)
- 错误写法:try { Promise.reject('oops'); } catch(e) { /* 不会执行 */ }
事件监听或回调中:错误需显式传递或抛到全局上下文
像 setTimeout、addEventListener、Node.js 回调等,错误不会自动进入当前 try-catch,必须手动处理。
- 在回调内加 try-catch,并调用 reject 或 throw(如果在 Promise 中)
- 对未捕获的异步错误,可监听 window.onerror 或 process.on('unhandledRejection')
- 示例:setTimeout(() => { try { riskyOperation(); } catch (e) { reject(e); } }, 100);
顶层异步边界:确保每个异步入口都有错误出口
无论是 API 请求、定时任务还是用户交互触发的异步操作,都应有明确的错误落点,避免静默失败。
- 组件生命周期中(如 React useEffect)发起的请求,应在内部处理 reject
- Node.js 脚本中,建议加上 process.on('unhandledRejection', ...)
- 不要依赖“外面有个大 try”来兜底——异步错误不会自动冒泡到外层同步栈
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










