如何在 JavaScript 中的异步生成器函数中抛出错误?

javascriptweb developmentfront end technology

代码经常会抛出错误,处理错误更为重要。JavaScript 还允许用户使用"throw"关键字抛出自定义错误。我们可以在 catch 块中捕获错误。

我们可以使用 try-catch 语法来捕获普通函数抛出的错误。让我们通过下面的示例来理解它。

示例 1(在常规函数中抛出错误)

在下面的示例中,我们创建了 throwError() 常规函数,它使用 throw 关键字抛出带有自定义错误消息的错误。我们在 try 块内执行了该函数。如果函数抛出任何错误,控制权将转到 catch 块,这就是我们检测错误的方式。

<html>
<body>
   <h3> Using the throw keyword to throw an error from the normal function </h3>
   <div id = "content"> </div>
   <script>
      let content = document.getElementById('content');
      // 从正常函数中抛出错误
      function throwError() {
         throw new Error('Error from normal function');
      }
      try {
         throwError();
      } catch (e) {
         content.innerHTML = e;
      }
   </script>
</body>
</html>

如果我们将 throwError() 函数设为异步,它将生成另一个错误,因为我们可以使用 try-catch 块处理同步函数抛出的错误。

要解决该问题,用户必须使用 then-catch 块语法来解决承诺。

语法

用户可以按照以下语法来解决异步函数抛出的错误。

throwError().then((res) => {
   // 打印内容
}).catch((err) => {
    // 打印错误消息
})

在上述语法中,throwError() 是一个返回承诺的函数,我们使用 then 和 catch 块来解决它。

示例 2(从异步函数抛出错误)

在下面的示例中,throwError() 函数是异步函数,因为我们在 function 关键字之前添加了"async"关键字。我们从异步函数中抛出错误,就像我们从常规函数中抛出错误一样。

之后,我们使用 then 和 catch 块处理承诺。在输出中,用户可以观察到,当异步函数抛出错误时,控制权转到 catch 块。

<html>
<body>
   <h3> Using the <i> throw </i> keyword to throw an error from the async function </h3>
   <div id = "content"> </div>
   <script>
      let content = document.getElementById('content');
      // 从正常函数中抛出错误
      async function throwError() {
         throw new Error('Error from Async function');
      }
      throwError().then((res) => {
         content.innerHTML = res;
      }).catch((err) => {
         content.innerHTML = err;
      })
   </script>
</body>
</html>

示例 3(通过拒绝异步函数中的 Promise 抛出错误)

我们可以从异步函数返回 Promise。异步函数中的拒绝 Promise 就像抛出错误一样。我们在回调函数中使用了 Reject() 方法来拒绝 Promise。

"then-catch"块用于解析函数返回的 Promise,用户可以看到控件转到 catch 块。

<html>
<body>
   <h3> Using the <i> reject </i> method to throw an error from the async function </h3>
   <div id = "content"> </div>
   <script>
      let content = document.getElementById('content');
      // 从正常函数中抛出错误
      async function throwError() {
         return new Promise((resolve, reject) => {
            reject("This promise is rejected from the async function." );
         });
      }
      throwError().then((res) => {
         content.innerHTML = res;
      }).catch((err) => {
         content.innerHTML = err;
      })
   </script>
</body>
</html>

用户学会了从异步函数中抛出错误。用户可以像常规函数一样使用"throw"关键字来抛出错误。由于异步函数返回承诺,因此用户需要使用"then-catch"块来处理错误,而不是使用try-catch块来处理。


相关文章