Node JS中的ZMQ:捕获错误

时间:2013-01-08 10:31:05

标签: node.js try-catch zeromq

我一直在使用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吗?

1 个答案:

答案 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%肯定; - )

希望它有所帮助,欢呼; - )