繁体   English   中英

NodeJS上的ZMQ:捕获错误

[英]ZMQ on NodeJS: catching errors

我已经使用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 {
    receiver.on('message', function(data){
        //do stuff  
    });
}
catch(e) {
    console.log("error " + e)
}

由于我必须使用所有这些try / catch来修改软件的很大一部分,因此我想确定这是否是捕获此类错误的正确方法(我几乎确定不是)。

有人可以确认吗? 否则,任何有经验的人都可以启发我我收到的错误吗?

谢谢

编辑:快速测试后,我可以确认99%的这种方法不起作用。 有没有一种方法可以弄清错误的出处?

第2次编辑:我发现此问题可能与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吗?

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

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

实际上,任何使用ZMQ调用的代码都应使用try-catch进行包装,因为它可能引发异常。 您可以在GitHub上进行检查。 我认为您的特殊情况可能会在此处引起 ,但不是100%确定;-)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM