Promise 中使用 async/await 如何优雅地处理异常

前言

在 JavaScript 中异步编程是不可避免的。Promise 是一个很好的异步编程方案。而使用 async/await 语法对 Promise 进行更好的封装,让代码看上去更加简洁易读。不过在实际项目中,我们往往需要对 Promise 的异步结果进行异常处理,以保证程序的健壮性。在这篇文章中,我将介绍如何在 Promise 中使用 async/await 语法,以优雅地处理异步异常。

Promise 异常处理

Promise 在原生支持异步处理的同时,也提供了丰富的异常处理函数和方法。其中最常见的异常处理方法有 .catch() 方法和 try-catch 语句。

.catch()

.catch() 方法为 Promise 提供最基本的异常处理能力。该方法会在 Promise 被 rejected 时被触发,可以通过链式调用来进行多个异常处理。代码示例如下:

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));

try-catch

对于使用 async/await 语法的 Promise,也可以像普通的同步代码一样使用 try-catch 语句来处理异常。代码示例如下:

async function fetchData() {
  try {
    const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error(error);
  }
}

async/await 异常处理

当使用 async/await 语法时,我们通常使用 try-catch 语句来处理异常。不过,在实际项目中,异常可能会因为 Promise 的 promiseRejectionEvent 而被抛出,会导致错误堆栈缺失,难以准确地追查异常原因。为此,我们需要对异常进行更加全面的处理,以保证程序的健壮性。

1. 使用 Promise.catch() 来处理异常

为了解决 async/await 中 Promise 异常被 promiseRejectionEvent 抛出的问题,我们可以使用 Promise.catch() 函数来对异常进行处理。这样可以在异常被抛出时,通过 promiseRejectionEvent 捕获到异常信息,也可以在 try-catch 捕获不到异常时,确保异常信息被正确地捕获和处理。

代码示例如下:

async function fetchData() {
  const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');

  const data = await response.json();

  return data;
}

fetchData()
  .then((data) => console.log(data))
  .catch((error) => {
    console.error(error);
  });

2. 使用自定义异常类来捕获异常

当捕获异常时,我们可以自定义异常类,并使用这个类来包装异常信息。这样可以提高代码的可维护性,并将错误处理逻辑从主要代码中分离出来。代码示例如下:

class CustomError extends Error {
  constructor(message) {
    super(message);
    this.name = 'CustomError';
  }
}

async function fetchData() {
  const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');

  if (!response.ok) {
    throw new CustomError('Fetch data error.');
  }

  const data = await response.json();

  return data;
}

fetchData()
  .then((data) => console.log(data))
  .catch((error) => {
    if (error instanceof CustomError) {
      console.error(error.message);
    } else {
      console.error(error);
    }
  });

总结

异步异常处理是 JavaScript 中一项重要的技能。在使用 Promise 和 async/await 语法时,我们可以通过 .catch() 方法和 try-catch 语句来处理异常。为了解决 async/await 中异常被 promiseRejectionEvent 抛出的问题,我们可以使用 Promise.catch() 函数来对异常进行处理。当然,我们也可以通过自定义异常类来捕获异常,并将错误处理逻辑从主要代码中分离出来。这些技巧将有助于提高代码的可维护性和健壮性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b5bc72add4f0e0ffe7bb57