await 遇到 rejected promise 时默认将拒绝原因作为异常抛出,可直接用 try...catch 捕获原始值;不应在 await 前链式调用 .catch() 破坏异常流,需统一处理时可用 safeawait 封装。

在 JavaScript 中,await 遇到 rejected 的 Promise 时,**默认就会把拒绝原因(rejection reason)当作异常抛出**,无需额外转换。这是 await 的核心行为之一。
await 本身就会抛出拒绝原因
await 不是“静默吞掉”错误,而是将 Promise 的 rejection 自动转为同步风格的异常——你可以直接用 try...catch 捕获它,捕获到的就是原始的拒绝值(比如一个 Error 实例、字符串、数字等)。
- 如果 Promise 被
Promise.reject(new Error('网络失败'))拒绝,await后的catch拿到的就是这个Error对象 - 如果 Promise 被
Promise.reject('超时')拒绝,catch拿到的就是字符串'超时' - 这和
throw行为一致:拒绝原因 = 抛出的值
正确写法:用 try...catch 捕获
你不需要手动“转换”,只需按异常处理方式写:
async function fetchUser() {
try {
const res = await fetch('/api/user');
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.json();
} catch (err) {
// err 就是 Promise 的拒绝原因
console.error('获取用户失败:', err); // 可能是 TypeError、Error 或字符串
throw err; // 可选择重新抛出
}
}
常见误区:不要用 .catch() 在 await 前“拦截”
下面这种写法会破坏 await 的异常流,让错误无法被外层 catch 捕获:
// ❌ 错误:提前吞掉了 rejection,await 得到的是 undefined 或默认值
const data = await promise.catch(err => {
console.error(err);
return null; // 导致 await 不再抛异常
});
除非你明确想降级处理并继续执行,否则应避免在 await 前链式调用 .catch()。
想统一处理所有 await 错误?可封装辅助函数
如果项目中大量需要“安全 await”(即不抛错、返回 [error, result] 元组),可以写一个工具函数:
async function safeAwait(promise) {
try {
const res = await promise;
return [null, res];
} catch (err) {
return [err, null];
}
}
// 使用
const [err, user] = await safeAwait(fetchUser());
if (err) handleErr(err);
else useUser(user);
但注意:这属于主动规避异常流,不是“转换”,而是绕过。原生 await 的设计本意就是让 Promise rejection 表现得像同步异常一样自然。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











