Web系のAPIをたたいていると、たまにエラーが発生することがあります。要因はサーバー側がたまたまおかしかったり、proxyだったりと様々です。
エラー時にはリトライしつつAPIをたたく方法はいろいろ考えられますが、C#でのスマートな実例がStackOverflowで紹介されていました。リトライ専用のクラスとstaticメソッドを実装して、呼出にはデリゲート、ラムダ式を用いるという手法です。
Rubyでも同様の処理を行うコードを考えてみました。
class Retry
@count = 10
@wait = 60
def self.do(func)
ret = nil
ex = nil
for i in 1..@count do
begin
ret = func.call
sleep(1)
return ret
rescue => e
ret = nil
ex = e
sleep(@wait)
end
end
if (!ex.nil?)
ex = Exception.new
end
throw ex
end
end