Как отловить сбои верхнего уровня на сервере EventMachine? - PullRequest
7 голосов
/ 02 октября 2011

У меня есть сервер 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

, но, похоже, он никогда не ловит ошибки.Я подозреваю, что это может быть что-то вроде нехватки памяти, которую я отслеживаю отдельно, но все же я хотел бы, чтобы этот сервер регистрировал свою непосредственную причину сбоя, если это возможно.

1 Ответ

15 голосов
/ 03 октября 2011

Если вам нужен универсальный обработчик ошибок, попробуйте EM.error_handler. Пример из документов :

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

Вам также может потребоваться более детальная обработка ошибок, в этом случае вы можете использовать механизм errback (см. Отложено ). Так, например, вы могли бы иметь в своем реакторном цикле:

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.

...