[Ruby] rescue 節で retry を用いると begin 以下を再度実行してくれる
memo.
[markdown]
## リトライで begin 節から再度実行する
> * [制御構造](http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fcontrol.html#retry)
>
> retry は、rescue 節で begin 式をはじめからもう一度実行するのに使用します。 retry を使うことである処理が成功するまで処理を繰り返すようなループを作 ることができます。
“`ruby
num_attempts = 0
begin
num_attempts += 1
raise
rescue
sleep 3
puts “Retry #{num_attempts}”
retry
ensure
puts ‘終了’
end
“`
強制終了させるまで止まらない。
## 指定回数リトライしてエラーを発生させる
強制終了させるまで無限ループになってしまうので、指定回数のリトライでエラーを発生させる。
> * [Ruby – rescue 節で一定回数 retry したあとは次に移るループ – Qiita](http://qiita.com/riocampos/items/0870f1b682a62d6477de)
“`ruby
MAX_ATTEMPTS = 3
num_attempts = 0
begin
num_attempts += 1
raise
rescue => e
if num_attempts <= MAX_ATTEMPTS
sleep 1
puts "Retry #{num_attempts}"
retry
else
puts e
raise
end
ensure
puts '終了'
end
``` ## XMLRPC::FaultException をキャッチしてリトライする この場合は、`XMLRPC::FaultException` を catch して `retry` すればよいということになる。 > * [library xmlrpc/client](http://docs.ruby-lang.org/ja/1.9.3/library/xmlrpc=2fclient.html)
> * [Rubyist Magazine – 標準添付ライブラリ紹介 【第 1 回】 XMLRPC4R](http://magazine.rubyist.net/?0007-BundledLibraries#l11)
“`prettyprinted
Error: 0: Failed to invoke method switchStatus in class jp.co.nulab.backlog.service.XmlRpcService: “statusId” is invalid. May be other user has updated status.
“`
具体的なコードサンプル。
> * [api – Twitter rate limit hit while requesting friends with ruby gem – Stack Overflow](http://stackoverflow.com/questions/16618037/twitter-rate-limit-hit-while-requesting-friends-with-ruby-gem/16626023#16626023)
## 補遺
> * [kimoto/retry-handler](https://github.com/kimoto/retry-handler)
> * [RubyGemsのTwitter::Baseがraiseするサーバーエラー関連の例外を拾いリトライ処理を行う – ぬいぐるみライフ(仮)](http://d.hatena.ne.jp/mickey24/20100912/1284241131)
[/markdown]