Deekor
Deekor

Reputation: 9499

Catch a specific error and try again

I have a ruby on rails app that performs a rake tweet every hour that sends out a tweet from the database. Ive noticed a couple times the tweet hasnt been sent, after looking at the logs i find:

2013-02-11T19:00:39+00:00 app[scheduler.8796]: Connecting to database specified by  DATABASE_URL
2013-02-11T19:00:39+00:00 app[scheduler.8796]: (__-){ Twitter is over capacity.
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/twitter-4.5.0/lib/twitter/response/raise_error.rb:21:in `on_complete'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/response.rb:9:in `block in call'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: rake aborted!
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/response.rb:8:in `call'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/response.rb:8:in `call'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/response.rb:63:in `on_complete'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/request/multipart.rb:13:in `call'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/response.rb:8:in `call'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/connection.rb:110:in `post'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/twitter-4.5.0/lib/twitter/request/multipart_with_file.rb:14:in `call'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/connection.rb:245:in `run_request'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/request/url_encoded.rb:14:in `call'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/lib/tasks/scheduler.rake:11:in `block in <top (required)>'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/twitter-4.5.0/lib/twitter/api/tweets.rb:129:in `update'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/twitter-4.5.0/lib/twitter.rb:52:in `method_missing'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/twitter-4.5.0/lib/twitter/api/utils.rb:82:in `object_from_response'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/twitter-4.5.0/lib/twitter/client.rb:81:in `request'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/twitter-4.5.0/lib/twitter/client.rb:70:in `post'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: (See full trace by running task with --trace)
2013-02-11T19:00:39+00:00 app[scheduler.8796]: Tasks: TOP => tweet
2013-02-11T19:00:41+00:00 heroku[scheduler.8796]: Process exited with status 1

How can I go about catching this specific error and retrying the tweet until it gets sent?

In my rake file:

task :tweet => :environment do
 if ApprovedTweet.all.size > 0
    t = ApprovedTweet.first
    Twitter.update(t.text)
    t.destroy
 end

Upvotes: 0

Views: 943

Answers (1)

m_x
m_x

Reputation: 12564

as far as one can tell from Twitter gem's documentation, the Twitter::Error::TooManyRequests seems to be the error you're trying to catch.

If i were you, i would not retry to send the tweet until it is sent (especially in a rake task - you would easily end up with a zombie process) but instead would allow a number of retries before failure :

begin     
  Twitter.update(t.text)
rescue Twitter::Error::TooManyRequests => e
  retries ||= 0
  retries +=  1
  if retries < ARBITRARY_MAX_RETRY_LIMIT
    # optionally sleep or delay for a while
    # ... or just log failure 
    retry
  else
    raise e # or another custom error of yours
  end
end

Upvotes: 1

Related Questions