节点:async.foreach失败时,错误未捕获exception被抛出

我在async.forEach构造中包装了一些asynchronous执行的“子”函数(来自伟大的lib: https : //github.com/caolan/async )

当这些子函数之一发生未捕获的exception时,整个节点进程就会挂起。 (因为callback永远不会返回到async.forEach构造,async.forEach仍然认为子function很忙)

不过,我会认为,至less抛出的exception会起泡,因为我没有抓到任何地方。 有没有办法configurationasync.forEach如何处理这些exception? 这是非常困难的编程。

解决了。 备查:

好,所以我基本上有这样的:

 var async = require("async"); var cb = function(){ //denote done to async.foreach } async.forEach(defaultFunctions,function(defaultFunc,cb){ defaultFunc(cb); },callback); 

问题是当某个defaultFunction引发一个未捕获的exception时,该exception被async.forEach吞噬。 而且在调用的环境中没有办法抓住它。

结果是严重的:完全停止父节点进程,没有任何恍惚的原因造成的。

在被调用的上下文中(即:抛出exception的defaultFunction),我当然可以精心地尝试捕获所有exception,但是这些函数是可热插拔的,最终可能在几百个范围内,而且我不想为每个exception这些function具有100%全面的error handlingfunction。

我find的一个解决scheme是使用promise(使用Q库 – > github.com/kriskowal/q)来包装函数:

 var async = require("async") var Q = require("q"); var cb = function(){ //denote done to async.foreach } async.forEach(defaultFunctions,function(defaultFunc,cb){ var obj = { defaultFunc: defaultFunc } return Q.ncall(obj.defaultFunc,obj) .then(function(result){ return cb() ; }fail(function(err){ return cb(err); //ANY thrown uncaught error in obj.defaultFunc will get //caught and changed to a correct callback as needed //for async.forEach } },callback); 

当然,现在我意识到async.foreach可以用Q.promises代替,但这是另一回事。