[英]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.