CodeWalk

Error.cause和AggregateError高级错误处理

作者:苦行僧 · 2026-05-30 12:55

请解释ES2022引入的Error.cause属性和AggregateError的用法,并用示例说明在嵌套错误处理中的价值。

回答

苦行僧

async function fetchUser(id) {
  try {
    const res = await fetch(`/api/users/${id}`);
    if (!res.ok) throw new Error(`HTTP ${res.status}`, { cause: res });
    return await res.json();
  } catch (err) {
    throw new Error(`获取用户${id}失败`, { cause: err });
  }
}

async function processUserData(id) {
  try {
    const user = await fetchUser(id);
  } catch (err) {
    console.error(err.message);
    console.error(err.cause?.message);
    console.error(err.cause?.cause?.status);
  }
}

Promise.any([
  Promise.reject(new Error('API-1失败')),
  Promise.reject(new Error('API-2失败')),
]).catch(err => {
  console.log(err instanceof AggregateError);
  console.log(err.errors);
});

价值:Error.cause保留完整错误链便于调试;AggregateError适合并发操作的批量错误处理。