Rubyはメソッド定義内で begin/end が無くても直接rescueやensureを記述できますが、これは無駄な記述を減らす上でとても魅力的な文法だと思います。
1 def foo 2 puts "hello world :-)" 3 rescue 4 puts "something wrong :'-(" 5 end
この書き方のまま、所定回数だけretryしたい場合、retry回数を覚えておくカウンタ変数を用意する場所に困ったりするのですが (ローカル変数として定義すると、retry後に再初期化されてしまいますからね) 以下のように引数として用意しておくと、methodが定義するブロックよりも外側のライフタイムを持つので、retryカウンタとして使えます。
1 def foo(bar = 0) 2 puts bar 3 raise 4 rescue 5 bar += 1 6 retry if bar < 10 7 end 8 9 foo
実行した結果は以下の通り
1 0 2 1 3 2 4 3 5 4 6 5 7 6 8 7 9 8 10 9
https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これでも出来そうです