如何捕获EventMachine服务器上的顶级故障?

我有一个EventMachine服务器,我用monit监控。 有时会崩溃,我试图找出原因,但我不清楚如何记录所有顶级故障。 我试过这样的代码:

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

但这似乎永远不会发现错误。 我怀疑它可能就像内存耗尽一样,我正在单独跟踪,但我仍然希望这台服务器在可能的情况下记录它的近似失败原因。

如果您想要一个catch-allerror handling程序,请尝试EM.error_handler。 来自文档的示例:

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

您可能还需要更细粒度的error handling,在这种情况下,您可以使用errback机制(请参阅Deferrable )。 例如,您可以在您的reactor循环中:

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

要使其正常工作,请在MyServer中include Deferrable ,然后在您想要引发错误时,调用fail