JavaScript:使用 Promises 和 Async/Await 进行错误处理

2025-06-08

JavaScript:使用 Promises 和 Async/Await 进行错误处理

JavaScript 中的错误处理可能很简单,但在某些地方却很棘手,尤其是 Promises。JS 允许借助 try、catch 和 throw 进行错误处理。

const main = () => {
  try {
    // Do something super crazy
    if (!bakePizza()) {
      throw new Error('Oh no!');
    }
  } catch (error) {
    // That escalated quickly
    handleOvenExplosion();
  }
}
Enter fullscreen mode Exit fullscreen mode

这看起来很简单,但是当涉及到承诺时就会变得有点棘手。

我们来看一个简单的 Promise 示例。下面的 Promise 函数从数据库中获取用户资料列表,其中结果集由 Promise 函数解析,错误被拒绝。

const userProfileQuery = new Promise((resolve, reject) => {
  connection.query('SELECT * FROM Users', [], (err, result) => {
    if (err) reject({ type: 'SQL', err});
    connection.release();
    resolve(result);
});
userProfileQuery
  .then((data) => {
    const userList = data;
    // Do something crazy with the list
  })
  .catch((err) => {
    // Oh, snap!
    // Handle error
  });
Enter fullscreen mode Exit fullscreen mode

在理想情况下,我们希望有一个 try-catch 块来处理单个文件中发生的所有错误。

const { getUserProfiles } = require('./helpers');
module.exports = () => {
  try {
    let userProfileList;
    getUserProfiles
      .then((data) => {
        userProfileList = data;
      })
      .catch((error) => {
        // Handle Promise Error
        // All errors thrown in this promise land here
      });
  } catch (error) {
    // Handle errors in this module
  }
}
Enter fullscreen mode Exit fullscreen mode

上述模块很简单——它借助 Promise 函数获取用户配置文件列表。

但是上述模块的问题在于,当我们在Promise 的块throw创建新的错误时,它总是会传递到Promise 的块中。这是因为在Promise 的块中抛出新的错误总是会被传递到调用 Promise 函数的块中。这不允许我们用一个 try-catch 块来处理模块中的所有错误。Errorthencatchthencatch

但是,唉!有一种方法可以借助 Async/Await 来解决这个问题。让我用一个例子更好地解释一下——

const { getUserProfiles } = require('./helpers');
module.exports = async () => {
  try {
    const userProfileList = await getUserProfiles;
  } catch (error) {
    // Handle errors in this module
    switch (type) {
      case ERROR_SQL:
        // Handle SQL errors
      default:
        // Handle common errors
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

代码中添加的这个 async/await 小函数做了两件事——
将值分配给由 promise 函数解析的变量。

如果 Promise 函数拒绝任何值,则抛出错误。
请注意,赋值操作仅当 Promise 函数解析了某个值时才有效,并且仅当 Promise 函数拒绝某些值时才会抛出错误。

这样,async/await 让我们的代码保持干净、可维护且易于阅读。


感谢阅读。如果您对此有任何想法,请留下评论。

链接错误:https://dev.to/gitfudge/javascript-error-handling-with-promises-and-async-await-in-es6-3akc
PREV
备份代码的 3 种方法(即使你不了解 Git)
NEXT
软件开发人员的软技能:优秀的程序员(或者臭名昭著的10倍效率工程师)也需要优秀的团队成员。两者缺一不可:认真倾听,然后沟通。沟通极其困难,所以即使你完全无意,也应该预料到这种情况会发生。如果当别人提出最终要改变某些事情时,你立刻感到受到攻击,那么问题就出在你身上,而不是这个想法本身。