3

私はTwitterGemを使用しており、長時間実行される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 

保護して再試行する他のエラーについて考えられますか?これはエラーを処理するための適切に構造化された方法ですか?考慮すべきいくつかの設計実装は何ですか?

4

3 に答える 3

2

最後に、発生した例外の種類をログに記録して再発生させるキャッチオール例外ハンドラーを用意することを検討してください。スクリプトが最初に失敗する可能性がありますが、少なくともその理由はわかります。

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
于 2011-06-20T23:01:00.667 に答える
0

またTwitter::Forbidden、Twittergemを使用するコードでエラーを検出します。

于 2011-06-20T18:33:03.977 に答える
0

rescue SystemCallErrorまたは、すべてのErrnoエラーがそのサブクラスであるため、を試すことができます。

于 2012-03-14T16:19:47.953 に答える