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
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
|
大丈夫っぽい
コメント