await 使 promise reject 转为同步异常并被 try...catch 捕获;未 await 的 promise 错误不会触发外层 catch,async 函数返回的 promise 状态仍需外部处理。

async 函数中用 try...catch 捕获错误,和普通函数基本一致,但关键在于:**await 后的 Promise 被 reject 时,会抛出异常,被外层 try...catch 捕获**;而未 await 的 Promise 错误不会自动进入 catch。
✅ 正确写法:await + try...catch
只有对可能失败的异步操作使用 await,错误才会被同步式地“抛出”,从而被 catch 捕获:
async function fetchData() {
try {
const res = await fetch('https://api.example.com/data');
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
return data;
} catch (err) {
console.error('请求失败:', err.message);
// 这里能捕获 fetch 失败、JSON 解析失败、手动 throw 的错误
}
}
❌ 常见错误:漏掉 await 或 catch 位置不对
以下几种情况 catch 不会生效:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 没 await 就直接调用 async 函数:返回的是 Promise,错误发生在 Promise 内部,不会触发外层 try...catch
- await 放在 try 外面:错误抛出时 try...catch 已执行完毕
-
多个 await 中间有同步错误但没包住:比如
res.json()前就 throw 了,但没在 try 里
? 补充技巧:并行请求怎么 try catch?
如果想同时发多个请求,并统一处理错误,推荐分别 await(更清晰)或用 Promise.allSettled():
// 方式1:分别 await(推荐,错误可定位)
try {
const [user, posts] = [
await fetch('/user').then(r => r.json()),
await fetch('/posts').then(r => r.json())
];
} catch (err) {
console.error('其中一个请求失败:', err);
}
// 方式2:用 allSettled(不中断,自行判断状态)
const results = await Promise.allSettled([
fetch('/user').then(r => r.json()),
fetch('/posts').then(r => r.json())
]);
results.forEach((result, i) => {
if (result.status === 'rejected') {
console.warn(`第 ${i + 1} 个请求失败:`, result.reason);
}
});
⚠️ 注意:async 函数本身返回 Promise,外部调用仍需处理
即使内部用了 try...catch,async 函数返回的 Promise 仍可能是 rejected(比如 catch 里没 re-throw,且没 return 值,那 Promise resolve 为 undefined;但如果 catch 里 throw 新错误,外部 Promise 就是 rejected):
async function badHandler() {
try {
await Promise.reject('oops');
} catch (e) {
console.log(e); // 打印了,但函数返回的 Promise 是 resolved(值为 undefined)
}
}
badHandler().catch(() => console.log('这行不会执行'));
async function goodHandler() {
try {
await Promise.reject('oops');
} catch (e) {
console.log(e);
throw e; // 主动 re-throw,让外部也能捕获
}
}
goodHandler().catch(() => console.log('这行会执行'));
不复杂但容易忽略:核心就是 —— await 让异步错误变成同步可捕获的异常,没 await 就还是 Promise 那套错误处理逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










