0Pricing
TypeScript Academy · 课时

异步 TypeScript 代码中的错误处理

使用带类型的包装器和工具管理异步错误

异步 TypeScript 代码中的错误处理 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。

欢迎

异步函数会增加错误处理的复杂性。TypeScript 可确保您正确处理 Promise 拒绝。

异步 try-catch

将 await 调用放在 try-catch 中,以处理 Promise 拒绝。
async function loadUser(id: number): Promise<User> {
  try {
    return await api.getUser(id);
  } catch (err: unknown) {
    if (err instanceof Error) throw new AppError(err.message);
    throw new AppError('Unknown error');
  }
}

Promise.all 错误

Promise.all 会因第一个拒绝而拒绝。请将其包装在 try-catch 中。
try {
  const [user, posts] = await Promise.all([getUser(id), getPosts(id)]);
} catch (err) { /* one or both failed */ }

Promise.allSettled

allSettled 会返回成功和失败的结果,而不会抛出错误。
const results = await Promise.allSettled([getUser(1), getPosts(1)]);
results.forEach(r => {
  if (r.status === 'fulfilled') console.log(r.value);
  else console.error(r.reason);
});

带类型的异步结果

将异步操作与结果模式结合,以实现显式的错误处理。
async function safeGet<T>(fn: () => Promise<T>): Promise<Result<T>> {
  try { return { ok: true, value: await fn() }; }
  catch (e) { return { ok: false, error: e as Error }; }
}

未处理的拒绝

在 Node.js 中监听未处理的拒绝,以防止程序崩溃。
process.on('unhandledRejection', (reason: unknown) => {
  console.error('Unhandled rejection:', reason);
  process.exit(1);
});

使用 Promise.race 实现超时

使用 Promise.race 实现带类型的超时模式。
function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {
  const timeout = new Promise<never>((_, reject) =>
    setTimeout(() => reject(new Error('Timeout')), ms));
  return Promise.race([promise, timeout]);
}

重试模式

使用带类型的错误实现带类型的异步重试。
async function retry<T>(fn: () => Promise<T>, times: number): Promise<T> {
  for (let i = 0; i < times; i++) {
    try { return await fn(); } catch (e) { if (i === times - 1) throw e; }
  }
  throw new Error('Unreachable');
}

并发错误处理

运行并发异步操作时处理错误。
const [userResult, postsResult] = await Promise.allSettled([
  getUser(id).then(u => ({ ok: true, value: u })).catch(e => ({ ok: false, error: e })),
  getPosts(id).then(p => ({ ok: true, value: p })).catch(e => ({ ok: false, error: e })),
]);

AsyncQueue 错误传递

异步迭代器中的错误会通过 for-await 正确传递。
async function* generate() {
  yield await fetchA();
  yield await fetchB(); // error here stops the loop
}
for await (const item of generate()) { process(item); }

Next.js 中带类型的错误中间件

在服务端操作中使用带类型的错误边界。
'use server';
async function createUser(data: CreateUserDto): Promise<Result<User>> {
  return safeGet(() => db.user.create({ data }));
}

快速检查

如果您没有在 async/await 函数中捕获被拒绝的 Promise,会发生什么?

回顾

异步 TypeScript 代码中的错误处理:您已经学习了本主题的关键概念,以及如何在实际 TypeScript 项目中应用它们。

常见问题解答

「异步 TypeScript 代码中的错误处理」课时是免费的吗?

是的 — 「异步 TypeScript 代码中的错误处理」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。

「异步 TypeScript 代码中的错误处理」这节课中我会学到什么?

使用带类型的包装器和工具管理异步错误 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「异步 TypeScript 代码中的错误处理」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 TypeScript Academy 课中编写并运行代码吗?

能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 带类型的错误类与层次结构
  2. Result 模式:Ok 与 Err
  3. 收窄捕获的错误:unknown 与 Error
  4. 异步 TypeScript 代码中的错误处理
← 返回 TypeScript Academy