async函数抛出未捕获异常时,返回的promise必然变为rejected状态,reason即为该错误;无论是否处理,promise状态确定且不可逆,未处理时触发unhandledrejection事件但状态不变。

async函数内部发生未捕获异常时,返回的Promise会变为rejected状态,其reason就是抛出的错误值。
async函数本质是Promise包装器
每个async函数都会隐式返回一个Promise。即使你写的是return 42,实际返回的是Promise.resolve(42);同理,一旦函数体内抛出未被捕获的错误(比如throw new Error('oops')或同步报错),引擎会自动用该错误reject这个Promise。
- 没有
try/catch、也没有.catch()处理时,错误不会“消失”,而是让返回的Promise进入rejected状态 - 这个行为和
Promise.reject(new Error(...))等价,不是未定义或pending挂起
错误传播路径清晰可追踪
rejected Promise会沿调用链向上传播:如果上层用await,异常会以正常JavaScript错误形式抛出;如果用.then().catch(),则进入catch回调。
-
async function f() { throw 'err'; }→f()返回的Promise状态为rejected,reason为'err' -
await f()会在调用处抛出'err'(除非被外围try捕获) -
f().catch(e => console.log(e))能接收到'err'
常见误解澄清
有人以为“没写catch就等于错误被吞掉”,其实不然:未处理的rejected Promise会触发unhandledrejection事件(在浏览器或Node.js中可监听),但Promise本身状态仍是rejected。
- Promise状态转变是确定性的:只要async函数体抛错,返回Promise必然rejected
- 是否“被处理”影响的是错误是否触发全局告警,不影响Promise已有状态
- 不能靠检查Promise是否pending来判断有没有出错——它要么fulfilled,要么rejected,不会卡住
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











