await 不捕获 reject,必须用 try/catch 或 .catch() 处理;遇 reject 会同步抛异常中断执行,类似 throw;推荐 try/catch 包裹 await,或链式 .catch() 返回默认值兜底。

await 本身不会捕获 reject,必须配合 try/catch 或 .catch() 才能处理被拒绝的 Promise。
await 遇到 reject 会直接抛出错误
当 await 等待一个被 reject 的 Promise 时,它会把 rejection 转换为同步抛出的异常(类似 throw),而不是返回一个错误值。这意味着如果没做任何错误处理,代码会中断执行,并可能触发未捕获异常(Uncaught Promise rejection)警告。
- 这和直接写
throw new Error()行为类似,只是源头是 Promise 的 reject - await 不会“吞掉”错误,也不会让后续语句继续运行(除非被捕获)
正确方式:用 try/catch 包裹 await
最常见也最推荐的方式是在 async 函数中用 try/catch 捕获 await 抛出的异常:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
async function fetchData() {
try {
const res = await fetch('/api/data');
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.json();
} catch (err) {
console.error('请求失败:', err.message);
return null;
}
}
- catch 捕获的是 Promise reject 的原因(比如 Error 实例、字符串、甚至 undefined)
- try 块里可以 await 多个 Promise,任意一个 reject 都会跳入 catch
替代方案:链式 .catch() 配合 await
你也可以在 Promise 后直接调用 .catch(),让它返回一个 resolve 的 Promise,从而避免 await 抛出异常:
async function getData() {
const data = await someAsyncOp()
.catch(err => {
console.warn('出错了,但继续执行:', err);
return null; // 返回默认值,让 await 不再抛错
});
console.log(data); // 即使出错也不会中断
}
- 适合需要兜底返回值、且不希望中断流程的场景
- 注意:.catch() 返回的必须是值或 Promise,否则仍可能抛错
常见误区提醒
不要以为 await 自带错误处理能力,也不要误用 Promise.resolve().catch() 来包裹整个 await 表达式——那没有意义:
- ❌
await Promise.reject('oops').catch(console.log)—— 这样写 catch 是多余的,因为 .catch() 已经处理了,await 得到的是 catch 的返回值 - ❌
await (async () => { throw 'error' })()没有 try/catch —— 会直接崩,控制台报 UnhandledPromiseRejectionWarning - ✅ 错误处理逻辑要落在 await 所在的 async 函数作用域内
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










