例外あがってきたときに回数制限つきで retry するのどうやったらきれいに書けるの問題 in ruby

1年くらい前(?)にわたしのTLで話題になったやつに1年越しでいい案が生まれたので、こういうのはどうかという記事を書く。 id:kksg 向けのエントリである。

class MyError < StandardError; end

def maybe_fail(max_retry = 1)
  raise MyError, 'error' unless rand(3) == 0
  p 'success!'
rescue MyError => e
  throw e if max_retry <= 0 # retry しすぎてたらそのまま例外投げ直す
  p 'failure!'
  maybe_fail(max_retry - 1)
end


maybe_fail     # 1回リトライする
maybe_fail(10) # 10回リトライする

リトライしたいみたいな処理、基本的に一連の処理であろうからそこはメソッドにくくってしまい、retry するときに再帰するというスンポーである