2009-11-17 41 views
6
begin 
#some routine 
rescue 
retry 
#on third retry, output "no dice!" 
end 

我想让它在“第三次”重试时打印一条消息。ruby​​:如何知道脚本是否在第三次重试?

+0

而是重试,把这件事情在3.times循环? – 2009-11-17 02:13:11

+0

你的意思是在一个循环中重试三次? – puqt 2009-11-17 02:15:05

回答

18

可能不是最好的解决方案,但一个简单的方法就是制作一个tries变量。

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 

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

最好的早期答案... – DigitalRoss 2009-11-17 02:31:26

+1

我喜欢这些替代品的第一个,因为它易于记忆和阅读。但它不会引发最后一次尝试的错误! – Peder 2011-08-24 09:53:56

+1

没错,第一个不适合大多数网络代码,但可以在不引发异常时使用。 – glebm 2011-09-01 12:03:28

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

宝石attempt被设计用于此,并且提供的尝试之间等待的选项。我自己并没有使用它,但它似乎是一个好主意。正如其他人已经证明的那样,这是块擅长的东西。

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

还有另一个名为retry-this的宝石,可以帮助这样的事情。

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 

这样一个创业板的好东西,而不是原始begin..rescue..retry的是,我们能够避免无限循环或引入一个变量只是为了这个目的。

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 

然后你可以使用它作为:

-> { raise 'hi' }.rescue(3) 
-> { raise 'hi' }.rescue(3) { |m, n| puts "message: #{m}, 
              number of attempts left: #{n}" } 
相关问题