在 async/await 函数中,try-catch 仅能捕获被 await 直接等待的 promise 拒绝或异常;未 await 的 promise 错误会静默失败,需用 promise.allsettled、包装成 promise 或全局 unhandledrejection 监听兜底。

在 async/await 函数中,用 try-catch 捕获错误是标准且推荐的做法——它让异步错误处理像同步代码一样直观,但要“完美结合”,关键在于理解 Promise 拒绝(reject)如何触发 catch,以及哪些错误会被捕获、哪些不会。
try-catch 只能捕获 await 表达式抛出的错误
async 函数内部的 Promise 拒绝(例如 fetch 失败、await Promise.reject()、或被 await 的函数抛出异常),只有在 被 await 直接等待时,才会进入 catch 块。未 await 的 Promise 错误会静默失败(或触发 unhandledrejection)。
✅ 正确(可捕获):
async function fetchData() {
try {
const res = await fetch('/api/data'); // 如果网络失败或 400+,fetch 返回 rejected Promise
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json(); // 如果 JSON 解析失败,会 reject 并被捕获
return data;
} catch (err) {
console.error('请求或解析出错:', err.message);
}
}
❌ 错误(无法捕获):
async function badExample() {
try {
fetch('/api/data').then(res => res.json()).catch(err => {
// 这里 err 不会进外层 catch!
console.log('被忽略的错误');
});
// 上面 fetch 是“火-and-forget”,没 await,错误不会冒泡到 try-catch
} catch (err) {
// 永远不会执行
}
}
避免漏掉未 await 的 Promise 错误
所有可能失败的异步操作,只要你想统一处理,就必须显式 await。常见易忽略点包括:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 多个并行请求时,用 Promise.allSettled() 替代 Promise.all() —— 后者只要一个 reject 就整体失败,前者返回每个结果的状态,便于逐个检查
- 定时器、事件监听器等非 Promise 异步逻辑,若需错误处理,应包装成 Promise 或单独 try-catch
- 避免在 then/catch 链中混用 await —— 容易导致控制流混乱和错误遗漏
区分业务错误与系统错误,做分级处理
不是所有错误都要同等对待。比如网络超时可重试,401 应跳登录页,500 则提示用户稍后重试。
建议在 catch 中判断 error 类型或属性:
try {
const data = await api.getUser(id);
} catch (err) {
if (err.name === 'AbortError') {
console.log('请求已取消');
} else if (err.status === 401) {
redirectToLogin();
} else if (err.status >= 500) {
showToast('服务暂时不可用,请稍后再试');
} else {
throw err; // 其他错误继续上抛,由更外层统一兜底
}
}
顶层兜底:全局 unhandledrejection 监听
即使小心 await,仍可能有漏网之鱼(如第三方库异步回调、未 await 的微任务)。添加全局监听可保底线:
window.addEventListener('unhandledrejection', event => {
console.error('未捕获的 Promise 拒绝:', event.reason);
// 上报错误、显示友好提示等
event.preventDefault(); // 阻止默认控制台警告(可选)
});
注意:这仅作兜底,不能替代主动的 try-catch 设计。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










