async函数中try catch仅捕获await表达式抛出的异常;未await的promise拒绝、settimeout中的throw均无法被捕获;需对所有异步操作使用await或单独.catch(),且注意错误最终仍通过promise流向调用方。

async 函数里用 try catch 捕获错误,和普通函数基本一样,但要注意:await 表达式抛出的异常才能被 catch 到,而 async 函数本身返回的是 Promise,直接 throw 的错误不会同步冒泡到外层 try catch。
try catch 只捕获 await 失败的情况
async 函数内部的异步操作(如 fetch、定时器、Promise.reject)必须用 await 调用,其拒绝(reject)才会被 try catch 捕获:
async function fetchData() {
try {
const res = await fetch('/api/data'); // 网络失败会进 catch
if (!res.ok) throw new Error('HTTP error');
const data = await res.json(); // JSON 解析失败也会进 catch
return data;
} catch (err) {
console.error('请求或解析出错:', err.message);
throw err; // 可选择重新抛出
}
}
不能捕获非 await 的 Promise 拒绝
下面写法中的 Promise.reject 不会被 try catch 捕获,因为它没被 await:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
async function badExample() {
try {
Promise.reject(new Error('这个不会被捕获')); // ❌ 没 await,错误丢失
setTimeout(() => { throw new Error('这个也不会'); }, 0); // ❌ 同步 try 无法捕获异步 throw
} catch (e) {
console.log('这里不会执行');
}
}
正确做法是:所有可能出错的异步操作都要 await,或显式 .catch():
- 用 await Promise.reject(...) 让它进入 try catch 流程
- 对不需要 await 的 Promise,单独加 .catch(e => {...})
处理多个 await 的常见写法
可以一个 try catch 包住多个 await,也可以按逻辑分段处理:
- 多个依赖步骤(如先登录再获取数据)适合共用 try catch,任一失败就中断流程
- 独立操作(如并行上传两个文件)建议分别 try catch,避免一个失败影响另一个
- 需要兜底时,可在 await 后检查结果,手动 throw 自定义错误
注意 async 函数返回值的错误流向
即使你在 async 函数里 try catch 了,最终 Promise 仍可能 reject:
- catch 中没 re-throw → 函数返回 resolved Promise(值为 undefined 或你 return 的值)
- catch 中 throw 或 return Promise.reject() → 函数返回 rejected Promise
- 调用方仍需处理返回的 Promise,比如用 .catch() 或外层 await + try catch
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










