gpt4 book ai didi

node.js - 理解 Node.js 中的 try 和 catch

转载 作者:太空宇宙 更新时间:2023-11-03 23:08:55 24 4
gpt4 key购买 nike

我是编码新手。试图理解为什么 try...catch 不应该在 node.js 中工作。我创建了一个示例,但与预期相反, try...catch 似乎有效。我的理解哪里出了问题?请帮忙。

function callback(error) { console.log(error); }
function A() {
var errorForCallback;
var y = parseInt("hardnut");
if (!y) {
throw new Error("boycott parsley");
errorForCallback = "boycott parsley for callback";
}
setTimeout(callback(errorForCallback),1000);
}

try {
A();
}
catch (e) {
console.log(e.message);
}
// Output: boycott parsley
// Synchronous behaviour, try...catch works

------------重新构建示例以反射(reflect)我在阅读下面的答案后的理解----------

function callback(error) { console.log(error); }
function A() {
var errorForCallback;
setTimeout(function(){
var y = parseInt("hardnut");
if (!y) {
// throw new Error("boycott parsley");
errorForCallback = "boycott parsley for callback";
}
callback(errorForCallback);
}, 1000);

}
try {
A();
}
catch (e) {
console.log(e.message);
}
// Output: boycott parsley for callback
// Asynchronous behaviour
// And if "throw new Error" is uncommented,
// then node.js stops

最佳答案

try-catch 方法与同步代码完美配合。并非您在 Node.js 中执行的所有编程都是异步的,因此在您编写的同步代码片段中,您可以完美地使用 try-catch 方法。另一方面,异步代码则不然。

例如,如果您有两个像这样的函数执行

var x = fooSync();
var y = barSync();

您会期望三件事,首先,barSync() 仅在 fooSync() 完成后执行,并且您会期望 x 将包含在执行 barSync() 之前执行 fooSync 返回的任何值。此外,您还希望如果 fooSync 抛出异常,则永远不会执行 barSync。

如果您在 fooSync() 周围使用 try-catch,您可以保证如果 fooSync() 失败,您可以捕获该异常。

现在,如果您有这样的代码,情况就会完全改变:

var x = fooAsync();
var y = barSync();

现在想象一下,当在这种情况下调用 fooAsync() 时,它实际上并未执行。它只是计划稍后执行。就好像 Node 有一个待办事项列表,此时它太忙于运行当前模块,当它发现这个函数调用时,它不会运行它,而是简单地将其添加到其待办事项列表的末尾。

所以,现在您不能保证 barSync() 会在 fooAsync() 之前运行,事实上,它可能不会。现在,您无法控制执行 fooAsync() 的上下文。

因此,在调度 fooAsync() 函数之后,它立即转向执行 barSync()。那么,fooAsync() 可以返回什么?此时什么也没有,因为它还没有运行。所以上面的 x 可能是未定义的。如果您将 try-catch 放在这段代码周围,那将毫无意义,因为该函数不会在此代码的上下文中执行。稍后,当 Node.js 检查其待办事项列表中是否有任何待处理任务时,它将执行。它将在另一个不断检查此待办事项列表的例程的上下文中执行,并且唯一的执行线程称为事件循环。

如果您的函数 fooAsync() 失败,它将在运行事件循环的线程的执行上下文中失败,因此它不会被您的 try-catch 语句捕获,位于到那时,上面的模块可能已经完成执行。

所以,这就是为什么在异步编程中你既不能获得返回值,也不能期望执行 try-catch,因为你的代码是在其他地方评估的,在与你认为调用的环境不同的另一个上下文中它。就好像你可以做这样的事情:

scheduleForExecutionLaterWhenYouHaveTime(foo);
var y = barSync();

这就是为什么异步编程需要其他技术来确定代码最终运行时发生了什么的原因。通常这是通过回调通知的。您定义一个回调函数,该函数会回调失败的详细信息(如果有)或函数生成的内容,然后您可以对此使用react。

关于node.js - 理解 Node.js 中的 try 和 catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24215224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com