Прошло много времени с тех пор, как об этом спросили, но я обнаружил, что пытаюсь сделать то же самое сегодня. В объекте HttpClient есть средство получения ошибок. Вот мой общий подход, использующий пул волокон:
fiber = Fiber.current
@request = EventMachine::HttpRequest.new(url)
@http = @request.get(opts)
@http.errback do
fiber.resume Exception.new("An error occurred in the HTTP request: #{@http.errors}", self)
end
@http.callback do
fiber.resume true
end
result = fiber.yield
raise result if result.kind_of?(Exception)
Одна вещь, которую я не понял, как это сделать, это обнаружить ошибки тайм-аута, если вы хотите отличить их от всего остального. Простейшим подходом было бы рассчитать время запроса и определить, превышает ли он указанное время ожидания, но я не нашел в em-http-request ничего, что отличало бы типы ошибок.