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