2011-10-02 4 views
7

私はmonitで監視しているEventMachineサーバーを持っています。時にはクラッシュすることもありますが、その理由を理解しようとしていますが、トップレベルのすべてのエラーをどのように記録するかは不明です。私はこのようなコードを試しました: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

catch-allエラーハンドラが必要な場合は、EM.error_handlerを試してください。 docsから例:

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

また、あなたはエラーバックメカニズムを使用することができ、その場合には、よりきめの細かいエラー処理を、望むこと(Deferrableを参照してください)。だから、例えば、あなたの原子炉のループを持っている可能性があり:

このため
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を呼び出します。

関連する問題