【发布时间】:2012-10-02 00:23:07
【问题描述】:
我将一些异步执行的“子”函数包装在 async.forEach 构造中(来自伟大的库:https://github.com/caolan/async)
当这些子函数之一因未捕获的异常而失败时,整个节点进程将挂起。 (因为回调永远不会返回到 async.forEach 构造,async.forEach 仍然认为子函数很忙)
但是我认为至少抛出的异常会冒泡,因为我没有在任何地方捕获它。有没有办法配置 async.forEach 如何处理这些异常?对此进行编程真的很困难。
【问题讨论】:
-
你的代码是什么样的?是什么引发了这个异常? (您的代码或其他模块)
-
我更笼统地问。关键是这些子功能可以以某种 CMS 方式进行热插拔/交换。从技术上讲,我可以将在这些子函数中调用的客户端代码包装在 try/catch 块中并自己返回正确的回调(错误)等。但是在定义这些函数时,我不想让自己担心错误处理等,只是功能流程。此类功能中的偶然错误不应停止整个系统。相反,我希望(经过大量测试的)基础设施调用配置的函数来处理抛出的错误。
-
不确定我的解释是否清楚。无论如何,我遇到了基于承诺而不是回调的 Q (github.com/kriskowal/q)。它看起来像是一个有据可查的特性,抛出的异常可以自动转换为(用 promise 说话)promise.rejections。将“子”函数从 100% 正确捕获所有错误的需要中解放出来。
-
与
async.series相同的问题。未捕获的异常会默默地终止进程。您使用 Q 的解决方法效果很好。
标签: node.js asynchronous error-handling promise