javascript / node.js中的exception是否会被lambdas捕获?

我有一个node.js服务器,我希望能够处理exception而不崩溃,我有代码有点像下面。 我想知道,所有的事件驱动的迷人和callback和lambdas和所有这一切,我的例外仍然会被我的主要切入点抓住?

try { http.get(..., function(results) { // Might get an exception here results.on('data', function () { // Might also get an exception here }); results.on('end', function () { // Might also get an exception here }); }); } catch(e) { // Will the exceptions from the lambdas be caught here? console.log('Nicely caught error: (' + e.name + '): ' + e.message); } 

谢谢

       

网上收集的解决方案 "javascript / node.js中的exception是否会被lambdas捕获?"

这取决于控制的stream程。 Node.js强调asynchronous性,asynchronous性的一个主要缺点是代码不会像习惯的语言那样stream动。

在同步语言中,调用者在function等待某些数据时被阻塞。 这使得程序员的工作非常简单,因为他们可以保证,当等待数据的函数返回时,将有数据供调用者使用。

这与asynchronous语言或非阻塞I / O完全相反。 在这种情况下,调用程序在函数调用期间被阻塞,但函数不必在返回之前等待数据或I / O完成。 这使得程序员稍微难一些,因为当函数调用返回时,不能保证是否有数据可用。 因此,非阻塞I / O通常意味着callback函数在数据可用于执行时被调用。

try/catch块与调用堆栈一起工作。 也就是说,当引发exception时,运行时将展开调用堆栈,直到find围绕引发exception的调用的catch块。 但是,由于http.get是一个非阻塞的调用,它会在注册一些callback之后立即退出,并继续处理。 callback函数在一个单独的“线程”中调用,因此调用不会嵌套在原始的try/catch块中。

图表真的能帮助解释这里的事情,但不幸的是,我没有一个可用的。

node.js标准库的error handling风格是调用相同的callback函数,但传递一个表示错误的非空的第一个参数。 如果asynchronous代码中有exception情况,请保持该格式。

一个抛出会爬上调用链,通常不知道callback在做什么(例如,tcp层不关心它的数据被parsing为http)。 可exception编程exception不适合asynchronous编程。

在您的示例代码中,http.getcallback中引发的潜在exception将落在您的catch块中。 当数据可读取时,callback堆栈从节点的事件循环中构build。

有一种方法可以捕获节点中未捕获的exception:

 process.on("uncaughtException", function (err) { console.log("uncaught exception: " + err); }); 

这将根据您的示例进行sorting,具体取决于例外情况。

麻烦的是,未捕获的exception可以以惊人的方式解开节点的内部工作,所以你真的不想依赖这个。 以一种可以处理它们的方式捕捉所有可能的exception的唯一可靠方法是在事件循环的每个入口点周围放一个try / catch。

这听起来很乏味,但通常并不是那么糟糕。 在您的示例程序中,您正在使用节点的API来处理HTTP请求,它仍然是一个非常低级的接口。 对于大多数情况,您只需要将此exception捕获function包装一次,然后将其用作库。