async函数中throw会立即终止执行并使返回promise变为rejected状态,reason即为抛出值(error实例或原始值),需通过.catch()或try/catch捕获,不向上冒泡而走promise链。

在 async 函数中使用 throw,会立即终止当前异步执行流,并将抛出的值包装为一个被拒绝(rejected)的 Promise。
throw 会触发 Promise rejection
async 函数本质上返回一个 Promise。当函数体内执行到 throw 语句时,不会像同步函数那样直接冒泡到调用栈上层,而是让返回的 Promise 进入 rejected 状态,其 reason 就是被抛出的值。
- 抛出原始值(如字符串、数字):Promise 的 rejection reason 就是该值
- 抛出 Error 实例:reason 是该 Error 对象,便于堆栈追踪和类型判断
- 即使在 await 后面 throw,也等效于直接 reject 当前 async 函数返回的 Promise
错误必须通过 Promise 链捕获
因为 throw 不会同步冒泡,所以不能用外层普通 try-catch 捕获(除非在同一个 async 函数内),而要依赖 Promise 的错误处理机制:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
-
.catch()或await ... catch可以捕获到 rejection - 未被捕获的 rejection 会触发
unhandledrejection事件(可能报错或静默失败,取决于环境) - 在顶层 async 函数中 throw,若没处理,等同于 Promise.reject(…)
与同步 throw 的关键区别
同步函数中 throw 会立即中断执行并向上冒泡;async 函数中的 throw 表现为“延迟拒绝”:
- throw 发生时,函数已返回 Promise,后续代码(如果有)不再执行
- 错误传递路径是 Promise 链,不是调用栈
- await 某个 Promise 被 reject 时,若没加 try-catch,也会导致当前 async 函数 throw(隐式 reject)
常见写法示例
以下两种方式效果一致,都使函数返回 rejected Promise:
async function f() { throw new Error('fail'); }async function f() { await Promise.reject(new Error('fail')); }
推荐显式 throw Error 实例,利于调试和统一错误处理逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










