4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

sue445Advent Calendar 2016

Day 13

Twitterのエラーをいい感じにエラーハンドリングする「twitter_retry」

Posted at

twitter_retryとは?

Twitter APIのエラーをいい感じにエラーハンドリングして、必要に応じていい感じにリトライするためのgemです

作った経緯

TwitterのAPIを実行するとたまにTwitterが調子が悪くてエラーになったりすることがあります。リトライすれば成功する可能性のあるエラーは自動でリトライしたくて作りました。

一応社内でTwitter API使ってるアプリを2〜3個くらい見て処理を汎用化しています。

使い方

TwitterRetry.with_handing do
  # some twitter API code
  twitter.update("some tweet")
end

TwitterRetry.with_handing のブロックの中でTwitter gem の処理を書くだけで、

  • 「Your account is suspended and is not permitted to access this feature.(凍結済みユーザのエラー)」が投げられたら TwitterRetry::SuspendedError を投げる
  • 「User is over daily status update limit.(一時的な規制)」 や 「Status is a duplicate.(重複連投)」などが投げられたらエラーは握りつぶす
  • Twitter側の一時的なエラー(Over capacityやInternal errorなど)が投げられたら1秒待って3回までリトライ。それでダメなら TwitterRetry::RetryOverError を投げる

と、いい感じにエラーハンドリングを行います。

TwitterRetry.with_handing の戻り値は通常は true ですが、リトライしても成功する可能性が低く呼び出し側でも握りつぶしたいエラー 1 の場合はリトライを行わず false を返します。

カスタマイズ

TwitterRetry.configure do |config|
  config.sleep_second     = 1
  config.max_retry_count  = 3
  config.retryable_errors << [Twitter::Error, "some error message"]
  config.ignorable_errors << [Twitter::Error, "some error message"]
end

デフォルトの設定 でだいたい事足りると思いますが、もしリトライ対象のエラーや握りつぶしたいエラーを追加したい場合には retryable_errorsignorable_errors に追加してください。

  1. 「Status is a duplicate.」 や「User is over daily status update limit.」など

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?