begin
#some routine
rescue
retry
#on third retry, output "no dice!"
end
我想让它在“第三次”重试时打印一条消息。ruby:如何知道脚本是否在第三次重试?
begin
#some routine
rescue
retry
#on third retry, output "no dice!"
end
我想让它在“第三次”重试时打印一条消息。ruby:如何知道脚本是否在第三次重试?
可能不是最好的解决方案,但一个简单的方法就是制作一个tries
变量。
tries = 0
begin
# some routine
rescue
tries += 1
retry if tries <= 3
puts "no dice!"
end
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
最好的早期答案... – DigitalRoss 2009-11-17 02:31:26
我喜欢这些替代品的第一个,因为它易于记忆和阅读。但它不会引发最后一次尝试的错误! – Peder 2011-08-24 09:53:56
没错,第一个不适合大多数网络代码,但可以在不引发异常时使用。 – glebm 2011-09-01 12:03:28
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
宝石attempt被设计用于此,并且提供的尝试之间等待的选项。我自己并没有使用它,但它似乎是一个好主意。正如其他人已经证明的那样,这是块擅长的东西。
begin
#your code
rescue
retry if (_r = (_r || 0) + 1) and _r < 4 # Needs parenthesis for the assignment
raise
end
还有另一个名为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的是,我们能够避免无限循环或引入一个变量只是为了这个目的。
def method(params={})
tries ||= 3
# code to execute
rescue Exception => e
retry unless (tries -= 1).zero?
puts "no dice!"
end
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}" }
而是重试,把这件事情在3.times循环? – 2009-11-17 02:13:11
你的意思是在一个循环中重试三次? – puqt 2009-11-17 02:15:05