簡體   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