2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
# File 'lib/knj/retry.rb', line 2
def self.try(args = {}, &block)
raise "No block was given." if !block_given?
args[:tries] = 3 if !args[:tries]
tries = []
error = nil
args[:tries].to_i.downto(1) do |count|
error = nil
dobreak = false
begin
if args[:timeout]
begin
Timeout.timeout(args[:timeout]) do
block.call
dobreak = true
break
end
rescue Timeout::Error => e
doraise = e if count <= 1
error = e
sleep(args[:wait]) if args[:wait] and !doraise
end
else
block.call
dobreak = true
break
end
rescue Exception => e
if e.class == Interrupt
raise e if !args.key?(:interrupt) or args[:interrupt]
elsif e.class == SystemExit
raise e if !args.key?(:exit) or args[:exit]
elsif count <= 1 or (args.key?(:errors) and args[:errors].index(e.class) == nil)
doraise = e
elsif args.key?(:errors) and args[:errors].index(e.class) != nil
end
error = e
sleep(args[:wait]) if args[:wait] and !doraise
end
if doraise
if args[:return_error]
tries << {:error => error}
return {
:tries => tries,
:result => false
}
else
raise e
end
elsif error
tries << {:error => error}
end
break if dobreak
end
res = true
res = false if error
return {
:tries => tries,
:result => res
}
end
|