我一直在使用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修改软件的大部分内容,我想确定这是否是正确的方法(我几乎可以肯定不是)来捕获这种错误。< / p>
任何人都可以证实这一点?否则任何有经验的人都可以告诉我我收到的错误?
由于
编辑:经过快速测试后,我可以确认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
吗?
答案 0 :(得分:1)
我认为你的try-catch块只包含了回调本身的注册。因此,当实际引发异常时,没有try-catch来处理它。它应该看起来像
receiver.on('message', function(data){
try {
//do stuff
}
catch(e) {
console.log("error " + e);
}
});
事实上,任何使用ZMQ调用的代码都应该用try-catch包装,因为它可以引发异常。你可以在GitHub上看看自己。我认为您的特殊例外可能会在here附近提出,但不是100%肯定; - )
希望它有所帮助,欢呼; - )