2011-10-02 45 views
7

我有一個EventMachine服務器,我正在用monit監視。有時它會崩潰,我想弄清楚爲什麼,但我不清楚我如何才能記錄所有最高級別的故障。我試過這樣的代碼:如何捕獲EventMachine服務器上的頂級故障?

begin 
    EventMachine::run do 
    EventMachine::start_server('0.0.0.0', PORT, MyServer) 
    end 
rescue Exception => e 
    puts "FAILURE: #{e.class}: #{e}" 
end 

但這似乎並沒有發現錯誤。我懷疑它可能是內存不足,我正在單獨跟蹤,但如果可能的話,我仍然希望此服務器記錄其最接近的失敗原因。

回答

15

如果您想要一個捕獲所有錯誤處理程序,請嘗試EM.error_handler。從docs例如:

EM.error_handler{ |e| 
    puts "Error raised during event loop: #{e.message}" 
} 

您可能還需要更細粒度的錯誤處理,在這種情況下,你可以使用errback可機制(見Deferrable)。因此,例如,你可以在你的反應器循環:

EventMachine::run do 
    server = EventMachine::start_server('0.0.0.0', PORT, MyServer) 
    server.errback { # handle error thrown by server here } 
end 

對於這項工作,include Deferrable在你的MyServer,那麼每當你想提高一個錯誤,請撥打fail