2011-10-02 51 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