async函数抛出错误会自动转为rejected promise;正常返回则resolve;try/catch捕获后不重抛则仍resolve。这是其隐式返回promise的底层机制决定的。

当 async 函数内部抛出 Error(无论是 throw new Error() 还是未捕获的运行时错误),JavaScript 引擎会自动将其转换为一个 rejected 的 Promise,无需手动 return Promise.reject()。这是 async/await 语法的底层机制决定的。
async 函数本质返回 Promise
每个 async 函数都会隐式返回一个 Promise:
- 若函数正常结束(无 throw、无未捕获异常),Promise 以
resolve(value)状态完成,value 是函数的返回值(或undefined); - 若函数执行中遇到
throw或同步错误(如引用未声明变量、调用非函数值等),Promise 立即以reject(error)状态拒绝,error 就是抛出的错误对象。
throw 语句直接触发 reject
在 async 函数体内写 throw,等价于在 Promise 构造器中调用 reject():
async function foo() {<br> throw new TypeError('Oops');<br>}<br>foo().catch(err => console.log(err instanceof TypeError)); // true
未捕获的异步错误也会被拦截
即使错误发生在 await 表达式之后(比如 await 一个 promise 后继续执行时出错),只要在 async 函数作用域内,仍会被捕获并转为 rejected:
async function bar() {<br> await Promise.resolve();<br> throw 'boom'; // 这里抛出 → 整个函数返回 rejected Promise<br>}
注意:try/catch 可阻止隐式 reject
如果在 async 函数内用 try/catch 捕获了错误,且没有重新 throw,则 Promise 不会 rejected,而是正常 resolve(除非 catch 块里显式 return 了 Promise.reject 或又 throw):
async function baz() {<br> try { throw 'handled'; }<br> catch (e) { return 'recovered'; }<br>}<br>baz().then(console.log); // 'recovered' —— Promise fulfilledJava免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











