JavaScript 如何异步生成器函数中抛出错误
代码经常会抛出错误,处理错误更加重要。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');
// throw error from normal function
function throwError() {
throw new Error('Error from normal function');
}
try {
throwError();
} catch (e) {
content.innerHTML = e;
}
</script>
</body>
</html>
如果我们将throwError()函数设置为异步函数,它将生成另一个错误,因为我们可以使用try-catch块来处理同步函数抛出的错误。
为了解决这个问题,用户必须使用then-catch块语法来解决promise。
语法
用户可以按照下面的语法来解决异步函数抛出的错误。
throwError().then((res) => {
// print content
}).catch((err) => {
// print error message
})
在上述的语法中,throwError()是一个返回promises的函数,我们使用then和catch块来解决它们。
示例2(从异步函数中抛出错误)
在下面的示例中,throwError()函数是一个异步函数,因为我们在function关键字之前添加了’async’关键字。我们从异步函数中抛出错误,就像从普通函数中抛出一样。
然后,我们使用then和catch块处理promise。从输出中,用户可以观察到,由于异步函数抛出错误,控制流去到了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');
// throw error from normal function
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');
// throw error from normal function
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”块来处理错误,因为异步函数返回的是promise,而不是使用try-catch块来处理错误。