Щебетать Gem - спасение, чтобы рассмотреть? - PullRequest
3 голосов
/ 20 июня 2011

Я работаю с Twitter Gem и создал долгосрочную задачу ruby. Мне бы хотелось, чтобы он мог обрабатывать распространенные ошибки, поэтому я собираюсь составить список тех, от которых мне следует защититься (например, сбойный кит 500)

Вот цикл начала / конца, в котором функционирует мой код:

Begin

# My (omitted) very long ruby task
# filled with Twitter API requests

rescue Errno::ENOENT
  sleep(5)
  logger.info "ENOENT error - attempting to retry"
  retry
rescue Errno::ETIMEDOUT
  sleep(5)
  logger.info " Operation timed out - attempting to retry"
  retry
rescue Errno::ECONNRESET
  sleep(5)
  logger.info "Connection reset by peer - attempting to retry"
  retry
end 

Можете ли вы вспомнить другие ошибки, которые нужно защитить, и повторите попытку? Это хорошо структурированный способ обработки ошибок? Какие реализации дизайна я должен рассмотреть?

Ответы [ 3 ]

2 голосов
/ 21 июня 2011

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

begin

# My (omitted) very long ruby task
# filled with Twitter API requests

rescue Errno::ENOENT
  sleep(5)
  logger.info "ENOENT error - attempting to retry"
  retry
rescue Errno::ETIMEDOUT
  sleep(5)
  logger.info " Operation timed out - attempting to retry"
  retry
rescue Errno::ECONNRESET
  sleep(5)
  logger.info "Connection reset by peer - attempting to retry"
  retry
rescue # This rescues StandardError and its children
  sleep(5)
  # The next line is somewhat pseudocode, because I don't use logger
  logger.this_is_somewhat_bad "Somewhat bad exception #{$!.class} #{$!} happened - I'm giving up"
  raise
rescue Exception
  sleep(5)
  # The next line is somewhat pseudocode, because I don't use logger
  logger.omg_wtf_bbq "Really bad exception #{$!.class} #{$!} happened - I'm giving up"
  raise
end
0 голосов
/ 14 марта 2012

В качестве альтернативы вы можете попробовать rescue SystemCallError, поскольку все ошибки Errno являются подклассами этого.

0 голосов
/ 20 июня 2011

Я также улавливаю ошибку Twitter::Forbidden в своем коде, который использует гем Twitter.

...