我一直在使用 NodeJS 的 ZMQ 绑定一段时间,但我从未收到过这样的错误:
Error: Interrupted system call
at Socket._ioevents (/path/node_modules/zmq/lib/index.js:144:22)
at Socket._flush (/path/node_modules/zmq/lib/index.js:273:23)
现在,我有一个创建拓扑的大系统。对我来说,考虑到这样的错误真的很难去看看拓扑的哪个节点搞砸了。这个想法是放置某种 try / catch 来捕获这个错误并记录它发生的位置。
有没有办法做到这一点?我认为以下代码不会起作用:
try {
receiver.on('message', function(data){
//do stuff
});
}
catch(e) {
console.log("error " + e)
}
由于我必须使用所有这些 try/catch 修改软件的很大一部分,我想确定这是否是捕获此类错误的正确方法(我几乎可以肯定不是)。
任何人都可以证实这一点?否则任何有经验的人都可以告诉我我收到的错误吗?
谢谢
编辑:经过快速测试,我可以确认 99% 这种方法不起作用。有没有一种方法可以让我知道该错误的来源?
第二次编辑:我发现这个问题可能与 ZMQ 从 2.0 版升级到 2.1 版有关。这是更改日志http://www.zeromq.org/docs:2-1-upgrade的链接,而以下是我最关心的部分:
In 2.0, ZeroMQ would ignore any interrupted system calls, which meant that no ZeroMQ
call would ever return EINTR if a signal was received during its operation. This caused
problems with loss of signals such as SIGINT (Ctrl-C handling), especially for language
runtimes. In 2.1, any blocking ZeroMQ call such as zmq_recv[3] will return EINTR if it
is interrupted by a signal.
那么有人知道如何包装我的阻塞调用来处理EINTR
吗?