async函数中try catch可捕获同步错误、await后Promise reject及其中异步抛出的错误;关键机制是await将Promise rejection转为同步错误;需await才能捕获,避免静默吞错,finally用于清理。

在 async 函数中使用 try catch 和普通函数基本一致,但关键在于:**await 会把 Promise 的 rejection 转为同步抛出的错误,从而被 catch 捕获**。这是 async/await 错误处理的核心机制。
try catch 能捕获哪些错误
async 函数中的 try catch 可以捕获:
- 同步抛出的错误(比如
throw new Error()) - await 后 Promise 被 reject 的错误(如 API 请求失败、JSON 解析出错)
- await 后 Promise 中异步抛出的错误(例如在 Promise 构造器里 throw)
正确写法示例
以下是一个典型且安全的写法:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
async function fetchUserData() {
try {
const res = await fetch('/api/user');
if (!res.ok) {
throw new Error(`HTTP ${res.status}: ${res.statusText}`);
}
const data = await res.json(); // 如果返回非 JSON,这里会 throw SyntaxError
return data;
} catch (err) {
console.error('获取用户数据失败:', err.message);
// 可选择重新 throw、返回默认值,或做上报
throw err; // 或 return { error: true, message: err.message };
}
}
常见陷阱与避坑建议
-
不要对未 await 的 Promise 使用 try catch:比如
fetch('/api/user').then(...)不会被外层 try 捕获,必须 await -
多个 await 建议分段处理:若后续逻辑不依赖前一步结果,可考虑用
Promise.all([...]).catch(...)或独立 try catch,避免一个失败阻断全部 - 避免在 catch 中静默吞掉错误:至少记录日志,否则调试困难
- 注意顶层 await(模块级)无法用 try catch 包裹:需放在 async IIFE 或函数中
配合 finally 清理资源
如果需要确保某些操作(如关闭加载状态、释放锁)一定执行,可用 finally:
立即学习“Java免费学习笔记(深入)”;
async function uploadFile(file) {
setLoading(true);
try {
const res = await fetch('/upload', { method: 'POST', body: file });
return await res.json();
} catch (err) {
console.error('上传失败', err);
throw err;
} finally {
setLoading(false); // 无论成功失败都执行
}
}

















