高级错误处理:AggregateError、自定义错误与重试策略
超越 try/catch,利用 AggregateError 组合多个错误,实现指数退避重试和结构化错误分类。 · 难度:入门 · +10XP
高级错误处理:AggregateError、自定义错误与重试策略
ES2021 引入了 AggregateError,用于将多个错误包装为一个错误对象。本教程将演示如何用它处理 Promise.any 和并发操作中的多个失败原因。你还会学到如何创建自定义错误类(继承 Error),附加额外上下文(如时间戳、错误码),并实现带有指数退避 (exponential backoff) 的重试机制。最后,我们讨论错误分类(可恢复 vs 不可恢复)和全局错误监听的最佳实践。
class NetworkError extends Error {
constructor(message, statusCode, retryable = true) {
super(message);
this.name = 'NetworkError';
this.statusCode = statusCode;
this.retryable = retryable;
}
}
function fetchWithRetry(url, retries = 3) {
let lastError;
for (let i = 0; i < retries; i++) {
try {
// 模拟网络请求
if (Math.random() < 0.7) throw new NetworkError('连接超时', 408, true);
return '成功';
} catch (err) {
lastError = err;
if (!err.retryable) throw err;
// 指数退避:等待 200ms * 2^i
const delay = 200 * Math.pow(2, i);
console.log(重试第 ${i+1} 次,等待 ${delay}ms);
// 注意:实际应使用 setTimeout 或异步
}
}
throw new AggregateError([lastError], '所有重试均失败');
}