在现代JavaScript异步编程中,async-await的错误处理机制是每个开发者必须掌握的核心技能。本文将通过实际代码示例展示如何有效处理async-await中的异常情况。
首先,让我们看一个基本的错误处理场景。假设我们有一个异步获取用户信息的函数:
async function fetchUser(id) {
const response = await fetch(`/api/users/${id}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
}
// 错误处理方式一:try-catch包装
async function getUserProfile(userId) {
try {
const user = await fetchUser(userId);
console.log('用户信息:', user);
return user;
} catch (error) {
console.error('获取用户失败:', error.message);
// 可以选择重新抛出或返回默认值
return null;
}
}
在实际项目中,我们经常需要处理多个异步操作的错误。以下是一个典型的多任务并行处理场景:
async function fetchUserData() {
try {
// 并行获取多个数据
const [user, posts, comments] = await Promise.all([
fetchUser(1),
fetchPosts(1),
fetchComments(1)
]);
return {
user,
posts,
comments
};
} catch (error) {
console.error('数据获取失败:', error.message);
throw new Error('用户数据加载失败');
}
}
需要注意的是,Promise.all会因为任何一个Promise失败而立即reject。如果希望即使部分请求失败也继续执行其他请求,可以使用Promise.allSettled:
async function fetchUserDataWithFallback() {
const results = await Promise.allSettled([
fetchUser(1),
fetchPosts(1),
fetchComments(1)
]);
// 处理每个结果
const user = results[0].status === 'fulfilled' ? results[0].value : null;
const posts = results[1].status === 'fulfilled' ? results[1].value : [];
const comments = results[2].status === 'fulfilled' ? results[2].value : [];
return { user, posts, comments };
}
最后,对于全局错误处理,我们可以在应用入口处设置未捕获异常的处理机制:
// 全局错误处理
process.on('unhandledRejection', (reason, promise) => {
console.error('未处理的Promise拒绝:', reason);
// 可以发送错误报告或记录日志
});
// 或者在浏览器环境中
window.addEventListener('unhandledrejection', event => {
console.error('未处理的Promise拒绝:', event.reason);
event.preventDefault();
});
通过这些实践,我们可以构建更加健壮的异步应用,有效避免因错误处理不当导致的程序崩溃。

讨论