你是如何更好地处理Async/Await的异常的?

在前端开发中,处理 async/await 的异常是一个重要的技能,因为它可以帮助你创建更健壮、更可预测的代码。以下是一些处理这些异常的最佳实践:

  1. 使用 try/catch

当使用 async/await 时,你可以使用 try/catch 块来捕获异常。async 函数会返回一个 Promise,如果这个函数内部抛出了异常,那么这个 Promise 会被拒绝(rejected)。你可以在 await 表达式周围使用 try/catch 来捕获这些异常。

async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    return data;
  } catch (error) {
    console.error('Error fetching data:', error);
    // 处理错误或重新抛出
    throw error;
  }
}
  1. 集中处理错误

在一些情况下,你可能希望在更高层级的函数中集中处理错误。这意味着你可以让 async 函数中的错误冒泡到调用它的函数中,并在那里处理它们。

async function main() {
  try {
    const data = await fetchData();
    // 使用数据...
  } catch (error) {
    // 在这里集中处理所有 fetchData 可能抛出的错误
    console.error('Main function error:', error);
  }
}
  1. 使用 .catch() 方法

虽然 async/await 语法使得代码看起来更像同步代码,但别忘了 async 函数实际上返回的是 Promise。因此,你也可以使用 .catch() 方法来处理错误。

fetchData()
  .then(data => {
    // 使用数据...
  })
  .catch(error => {
    console.error('Error fetching data:', error);
  });
  1. 自定义错误类

为了更清晰地表达错误的类型和原因,你可以创建自定义的错误类。这有助于你在捕获错误时做出更明智的决策。

class FetchError extends Error {
  constructor(message, statusCode) {
    super(message);
    this.statusCode = statusCode;
  }
}

// 然后在 async 函数中使用它:
async function fetchData() {
  // ...
  if (!response.ok) {
    throw new FetchError('Failed to fetch data', response.status);
  }
  // ...
}
  1. 错误处理和重试逻辑

在某些情况下,当发生错误时,你可能希望重试操作。你可以结合使用 try/catch 块和循环来实现这一点。

async function fetchDataWithRetry(url, attempts = 3) {
  let error;
  for (let i = 0; i < attempts; i++) {
    try {
      const response = await fetch(url);
      // ...处理响应...
      return response; // 如果成功,则退出函数并返回结果
    } catch (e) {
      error = e; // 保存错误信息以便后续处理或报告
      console.log(`Attempt ${i + 1} failed. Retrying...`);
      // 可以添加延迟以减少对服务器的连续请求压力:await new Promise(resolve => setTimeout(resolve, 1000));
    }
  }
  throw error; // 如果所有尝试都失败,则抛出最后一个错误
}
  1. 在 Promise 链中保持错误处理的一致性

如果你的代码混合使用了 async/await 和 Promise 的 .then()/.catch() 方法,确保你在整个链中一致地处理错误。这有助于避免意外的行为或未处理的错误。

posted @ 2025-01-16 09:19  王铁柱6  阅读(51)  评论(0)    收藏  举报