2009-11-17 18 views

cevap

18

Muhtemelen en iyi çözüm değil, basit bir yol da tries değişkenini oluşturmaktır.

tries = 0 
begin 
    # some routine 
rescue 
    tries += 1 
    retry if tries <= 3 
    puts "no dice!" 
end 
10
loop do |i| 
    begin 
    do_stuff 
    break 
    rescue 
    raise if i == 2 
    end 
end 

veya

k = 0 
begin 
    do_stuff 
rescue  
    k += 1 
    k < 3 ? retry : raise 
end 
+0

İlk cevapların en iyisi ... – DigitalRoss

+1

Bu alternatiflerin ilkini seviyorum çünkü hatırlanması ve okunması kolay. Ama son denemede hatayı yükseltmiyor! – Peder

+1

Bu doğru, ilki çoğu ağ kodu için uygun değildir, ancak istisna kaldırılmaması gerektiğinde kullanılabilir. – glebm

2
class Integer 
    def times_try 
    n = self 
    begin 
     n -= 1 
     yield 
    rescue 
     raise if n < 0 
     retry 
    end 
    end 
end 

begin 
    3.times_try do 
    #some routine 
    end 
rescue 
    puts 'no dice!' 
end 
1

mücevher attempt bunun için tasarlanmıştır ve denemeleri arasındaki bekleme seçeneği sunmaktadır. Kendim kullanmadım ama harika bir fikir gibi görünüyor. Aksi halde, diğer insanların da gösterdiği gibi, bu, bir şeylerin önünü kesmek gibi bir şeydir.

5
begin 
    #your code 
rescue 
    retry if (_r = (_r || 0) + 1) and _r < 4 # Needs parenthesis for the assignment 
    raise 
end 
3

böyle bir şeyle yardımcı olur retry-this adında başka mücevher yoktur.

ruby-1.9.2-p0 > require 'retry-this' 
ruby-1.9.2-p0 > RetryThis.retry_this(:times => 3) do |attempt| 
ruby-1.9.2-p0 >  if attempt == 3 
ruby-1.9.2-p0 ?>  puts "no dice!" 
ruby-1.9.2-p0 ?> else 
ruby-1.9.2-p0 >  puts "trying something..." 
ruby-1.9.2-p0 ?>  raise 'an error happens' # faking a consistent error 
ruby-1.9.2-p0 ?> end 
ruby-1.9.2-p0 ?> end 
trying something... 
trying something... 
no dice! 
=> nil 

ham begin..rescue..retry aksine böyle bir gem hakkında iyi bir şey biz sonsuz döngü önlemek ya da sadece bu amaç için bir değişken tanıtan olabilir.

1
def method(params={}) 
    tries ||= 3 
    # code to execute 
rescue Exception => e 
    retry unless (tries -= 1).zero? 
    puts "no dice!" 
end 
0
Proc.class_eval do 
    def rescue number_of_attempts=0 
    @n = number_of_attempts 
     begin 
     self.call 
     rescue => message 
     yield message, @n if block_given? 
     @n -= 1 
     retry if @n > 0 
     end 
    end 
end 

Ve sonra olarak kullanabilirsiniz:

-> { raise 'hi' }.rescue(3) 
-> { raise 'hi' }.rescue(3) { |m, n| puts "message: #{m}, 
              number of attempts left: #{n}" } 
İlgili konular