return被拒绝的promise不会触发当前try/catch,因其是同步返回rejected promise;只有await才会解包promise并使reject转为可捕获异常。

async 函数中 return 一个被拒绝的 Promise(比如 return Promise.reject(new Error(...))),**不会触发当前函数内的 try/catch**,它等价于直接让函数返回一个 rejected promise —— 异常“漏出”到调用方,必须由调用方显式处理。
为什么 return 不会被 catch?
因为 return 是同步退出函数,它只是把一个 rejected promise 作为返回值交出去;而 await 才会暂停执行、解包 promise,并在 promise 被 reject 时把错误转为可捕获的异常。两者机制完全不同。
-
await Promise.reject(...)→ 触发catch块 -
return Promise.reject(...)→ 函数立即返回 rejected promise,try/catch完全不生效
常见误写与后果
下面这段代码看似在 try 内“抛错”,实则无法捕获:
async function bad() {
try {
return Promise.reject(new Error('oops'));
} catch (e) {
console.log('never runs'); // 这行永远不会执行
}
}
bad(); // UnhandledPromiseRejectionWarning!
调用 bad() 后,控制台会报未处理的 promise 拒绝警告 —— 因为没人接住它返回的 rejected promise。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
正确写法:用 await 或 .catch()
要让错误进 catch,必须用 await 等待那个 promise:
-
推荐:await + try/catch(语义清晰)
async function good() {<br> try {<br> await Promise.reject(new Error('oops'));<br> } catch (e) {<br> console.error(e.message); // ✅ 正常捕获<br> }<br>} -
替代:链式 .catch(适合调用端统一处理)
async function alsoGood() {<br> return Promise.reject(new Error('oops'));<br>}<br>alsoGood().catch(e => console.error(e.message)); // ✅ 显式接住
注意:throw 和 return 的本质区别
在 async 函数里:
-
throw new Error(...)→ 等价于return Promise.reject(...),同样不会被同级 try/catch 捕获(除非你在 await 它) -
return Promise.resolve(...)或return 123→ 都会被自动包装成 fulfilled promise,调用方需 await 或 .then 获取值
所有 async 函数都返回 promise,错误处理的关键不在“怎么抛”,而在于“谁来接”——要么调用方 await 并配 try/catch,要么调用方加 .catch(),二者缺一不可。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










