0

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

4

1 回答 1

1

我认为您的 try-catch 块仅包装了回调本身的注册。因此,当实际引发异常时,没有 try-catch 来处理它。它应该看起来像

receiver.on('message', function(data){
    try {
        //do stuff
    }
    catch(e) {
        console.log("error " + e);
    }  
});

事实上,任何使用 ZMQ 调用的代码都应该用 try-catch 包装,因为它会引发异常。你可以在 GitHub 上检查自己。我认为你的特殊例外可能会在这里提出,但不是 100% 确定;-)

希望它有所帮助,干杯;-)

于 2013-01-15T15:14:57.863 回答