在 async/await 中,try...catch 只能捕获位于同一 try 块内的 await 表达式错误;await 必须置于 try 内才能被捕获,跨函数或顶层 await 无法直接捕获,未 await 的 Promise 错误也会被忽略。

在 async/await 中,try...catch 可以直接捕获 await 表达式抛出的错误(包括 Promise 拒绝),但必须确保 await 出现在 try 块内 —— 它不能跨函数边界自动传递错误。
✅ 正确写法:await 放在 try 块里
这是最常用、最推荐的方式。只要 await 的 Promise 被 reject,就会被 catch 捕获:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
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);
// 可返回默认值、重新抛出、或做降级处理
return null;
}
}❌ 常见错误:把 await 写在 try 外面
以下写法无法捕获错误,因为 await 不在 try 作用域内:
async function badExample() {
const promise = fetch('/data'); // 这里没 await
try {
const res = await promise; // ✅ await 在 try 内 → OK
} catch (e) { /* ... */ }
<p>// ❌ 下面这行如果出错,不会进上面的 catch
const data = await otherAsyncCall(); // 若报错,会变成未处理的 Promise rejection
}解决办法:每个可能出错的 await 都应包裹在自己的 try...catch 中,或统一放在一个 try 块里。
? 进阶技巧:并行请求 + 统一错误处理
多个 await 并行执行时,可配合 Promise.allSettled() 避免一个失败导致全部中断,并集中处理结果和错误:
async function fetchMultiple() {
const promises = [
fetch('/api/users'),
fetch('/api/posts'),
fetch('/api/comments')
];
<p>try {
const results = await Promise.allSettled(promises);</p><pre class="brush:php;toolbar:false;">results.forEach((result, i) => {
if (result.status === 'fulfilled') {
console.log(`请求 ${i} 成功:`, result.value);
} else {
console.warn(`请求 ${i} 失败:`, result.reason);
}
});} catch (err) { // 注意:Promise.allSettled 不会 reject,所以这里通常不会进 catch console.error('意外错误:', err); } }
⚠️ 注意事项
-
顶层 await 不支持 try...catch:模块顶层的
await无法用try...catch包裹,需封装进 async 函数中 -
未 await 的 Promise 不会被捕获:漏掉
await就等价于普通变量赋值,错误会以未处理 rejection 形式抛出 -
同步错误也能捕获:比如
JSON.parse()报错、类型错误等,只要发生在try块内,catch一样能抓到 -
避免空 catch:只写
catch {}会吞掉错误,建议至少记录日志或 re-throw

















