Ruby 実行のエラー時に n 回リトライするメソッド
n.times_retry でブロック内をエラーがあれば最大 n 回再実行し、それを超えれば停止します。エラーがないかリトライに成功すれば、そのまま次へ処理が渡されます。
引数の massage は true ならば情報を出力します(デフォルト true)。wait: n は retry の前に n秒スリーブします(デフォルトは 0)。ブロック引数の i は i 回目の実行ということです。
5.times_retry(message: true, wait: 1) do |i| puts i if i <= 3 raise "sample error" end end puts "success" __END__ #出力 1 Error: retry 1 times_retry.rb:23:in `block in <main>' times_retry.rb:5:in `times_retry' times_retry.rb:21:in `<main>' 2 Error: retry 2 times_retry.rb:23:in `block in <main>' times_retry.rb:5:in `times_retry' times_retry.rb:21:in `<main>' 3 Error: retry 3 times_retry.rb:23:in `block in <main>' times_retry.rb:5:in `times_retry' times_retry.rb:21:in `<main>' 4 success
メソッドのコード。
class Integer def times_retry(message: true, wait: 0) n = 1 begin yield(n) rescue => e if n <= self puts "Error: retry #{n}" if message puts e.backtrace if message n += 1 sleep(wait) retry end puts "Error: stop" if message raise e end end end