node.js - 当未捕获错误时, Node : async. foreach 会默默失败,抛出异常

标签 node.js asynchronous error-handling promise

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

当这些子函数之一因未捕获的异常而失败时,整个 Node 进程将挂起。 (由于回调永远不会返回到 async.forEach 构造,因此 async.forEach 仍然认为子函数正忙)

但是我认为至少抛出的异常会冒泡,因为我没有在任何地方捕获它。有没有办法配置 async.forEach 如何处理这些异常?对此进行编程确实很困难。

最佳答案

已解决。供将来引用:

好吧,我基本上有这个:

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

问题在于,当某个defaultFunction抛出未捕获的异常时,该异常会被async.forEach吞没。 。此外,无法在调用上下文中捕获它。

结果是严重的:父 Node 进程完全停止,没有任何原因导致它。

在被调用的上下文中(即:抛出异常的defaultFunction),我当然可以小心翼翼地 try catch 所有异常,但这些函数是可热插拔的,最终可能有数百个,我不希望为这些函数中的每一个函数提供 100% 完全验证的错误处理。

我发现的一个解决方案是使用 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 轻松完成,但那是另一个故事了......

关于node.js - 当未捕获错误时, Node : async. foreach 会默默失败,抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12837839/

相关文章:

node.js - mongodb 中的多个组聚合

node.js - 在全局对象上声明的函数

angularjs - for 循环中的递归 $http.get

c# - 最佳 TPL 数据流设计?

php - 如何处理上传有问题的 JPEG 导致的错误?

error-handling - 检查 panic 而不从中恢复

node.js - Mongoose 和 MongoDB,关系不同步

javascript - 从 NTLM token Javascript 获取用户名

javascript - 通过 Twilio 发送 SMS 时如何响应 promise 中的错误?

c++ - 如何在 C++ 中检查无效/未初始化的对象