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