u16suzuの blog

日々学んだことのメモブログです。

リトライ処理のメモ

Rubyでリトライ処理をする際のテンプレ。再帰を使って綺麗に書ける。

class RetryException < StandardError; end

def foo
  p Time.now
  raise RetryException
end

def retry_foo( rc = 3)
  begin
    foo
  rescue RetryException => ex # RetryException以外はretryしない
    retry_foo( rc - 1 ) if rc > 1
  end
end

retry_foo

これだと、複数のメソッドに対応できない。 後で、blockで処理を受け取るようにしたい。

追記: retry 制御構文というものがあったので、それを使って書き直してみた。

def foo
  p Time.now
  raise
end

# 単純にfooメソッドをretryする
def retry_foo(count=3)
  c = count
  begin
    c = c - 1
    foo
  rescue
    retry if c > 0
  end
end

# 受け取ったブロックをretryする
def retryer(count=3)
  c = count
  begin
    c -= 1
    yield
  rescue
    retry if c > 0
  end
end

# retry_foo(5)
retryer(3) do
  foo
end