Robert Klemme
11/24/2003 8:50:00 AM
"Gennady" <bystr@mac.com> schrieb im Newsbeitrag
news:4BB0276B-1E4F-11D8-A73D-0003939AEA24@mac.com...
> On Nov 23, 2003, at 23:02, Gennady wrote:
>
> >
> > On Nov 23, 2003, at 22:11, Hal Fulton wrote:
> >
> >> def try(quiet=true,times=5,secs=1,&block)
> >> count = 0
> >> catch :finished do
> >> begin
> >> block.call
> >> rescue => err
> >> puts "Error was: #{err}" if not quiet
> >> count += 1
> >> throw :finished if count > times
> >> sleep secs
> >> retry
> >> end
> >> end
> >> end
> >
> >
> > def try(quiet=true,times=5,secs=1,&block)
> > return unless block
> > times.times do
> > begin
> > return block.call
> > rescue => err
> > puts "Error was: #{err}" unless quiet
> > sleep secs
> > end
> > end
> > end
> >
>
> Oops, times.times should become times.next.times to function like the
> original. Also, when all attempts are exhausted, the last exception
> must be re-raised or another more appropriate one raised (boolean
> return would also do the trick).
Combining the two of them (i.e. times.next and re-raising) by simply
adding a line,
plus adding a check to allow for non-sleeping retries,
plus output parameter that can be an IO or an Array,
plus changed the first return to an exception in order to let the user
know he forgot something:
def try(times=0, secs=nil, log=nil, &block)
raise LocalJumpError, "no block given" unless block
times.times do
begin
return block.call
rescue => err
log << "Error was: #{err}\n" if log
sleep secs if secs
end
end
block.call
end
Cheers
robert