async/await 通过将异步错误同步化,使 try/catch 能精准捕获 await 拒绝的 promise 或同步异常,支持单点捕获、并行容错、错误分类处理,并需注意语法限制与全局兜底。

async/await 确实让 JavaScript 的异常处理变得更可控,核心在于它把异步错误“拉回”到同步风格的 try/catch 语境中,避免了 Promise 链中错误传播路径模糊、捕获位置不明确的问题。
异常可控性的关键体现
-
await遇到 rejected Promise 时,会立即抛出错误,就像同步代码里throw一样,直接进入最近的catch块 - 错误不会自动“跳过”后续
await,也不会因漏写.catch()而静默丢失,未捕获时会清晰地以UnhandledPromiseRejection形式暴露 - 同一个
try块内多个await的错误可统一兜底,也可通过条件判断或错误类型区分做差异化处理(比如网络超时重试、401跳登录)
常见可控场景与写法
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
单点精准捕获
每个await前加独立try/catch,适合需要为不同请求定制 fallback 的情况:const user = await (async () => { try { return await fetch('/api/user').then(r => r.json()); } catch { return { id: -1, name: '游客' }; // 默认用户 } })(); -
并行任务中的容错控制
结合Promise.allSettled或return_exceptions=True类思路(JS 中用map + catch包装):const [userRes, orderRes] = await Promise.all([ fetch('/api/user').catch(() => null), fetch('/api/order').catch(() => null) ]); -
错误分类与再抛出
在catch中判断错误类型,只拦截预期错误,非预期错误继续上抛:try { const data = await fetch('/api/data'); if (!data.ok) throw new HttpError(data.status); return await data.json(); } catch (err) { if (err instanceof HttpError && err.code === 404) { return {}; // 404 返回空对象 } throw err; // 其他错误交给外层处理 }
注意边界情况
-
await只对 Promise 拒绝生效,普通同步异常(如JSON.parse('invalid'))同样被catch捕获,无需额外适配 - 不在
async函数里用await会报语法错误,而 Promise 的.catch()可在任意地方链式调用,二者适用层级不同 - 全局未处理拒绝需配合
window.addEventListener('unhandledrejection')监听,作为最后一道防线
本质上,可控性来自结构收敛:错误发生点、捕获点、处理逻辑三者在视觉和执行流上高度对齐,不再依赖链式回调的隐式传递。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










