retryする

2021-03-07

ruby

5回までリトライする

1
2
3
4
5
6
7
8
def ret(num=0)
  raise StandardError.new("#{num+=1}回目")
rescue
  puts $!.message
  retry if num < 5

  raise "#{num}度は許さん"
end

もう1度だけチャンスをやろう

1
2
3
4
5
6
7
8
def retry_once
  raise StandardError.new("許して")
rescue
  puts $!.message
  retry if @retry.nil?.tap { @retry = false }

  raise "許さん"
end

使ってみる

1
2
3
4
5
6
> retry_once
許して
許して
Traceback (most recent call last):
....
RuntimeError (許さん)

カウンター使わずにちょっとだけスマートにかけた気がする

モジュール化してみる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
module Retryable
  def retries_call(num=3)
    count = 0
    begin
      count += 1
      yield
    rescue
      retry if count < num

      raise $!
    end
  end
end

class Foo
  def foo(ary)
    ary.each do |i|
      puts i
      raise 'abo-n' if i % 2 == 0
    end
    ary.sum
  end
end

使ってみる

1
2
3
4
5
6
7
8
9
> bar = foo.retries_call do
>   foo.foo([2])
> end
2
2
2
Traceback (most recent call last):
....
RuntimeError (abo-n)

3回トライして例外

1
2
3
4
5
6
7
8
9
> bar = foo.retries_call do
>   foo.foo([1,3,5])
> end
1
3
5
=> 9
> bar
=> 9

大丈夫っぽい

コメント

投稿する

投稿したコメントはご自身で削除できません

不適切なコメントと判断した場合は管理側で削除することがあります