begin
#some routine
rescue
retry
#on third retry, output "no dice!"
end
"Üçüncü" yeniden denemede bir mesaj yazdırmak için bunu yapmak istiyorum.ruby: komut dosyasının 3. yeniden deneme olup olmadığını nasıl öğrenebilirim?
begin
#some routine
rescue
retry
#on third retry, output "no dice!"
end
"Üçüncü" yeniden denemede bir mesaj yazdırmak için bunu yapmak istiyorum.ruby: komut dosyasının 3. yeniden deneme olup olmadığını nasıl öğrenebilirim?
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
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
İlk cevapların en iyisi ... – DigitalRoss
Bu alternatiflerin ilkini seviyorum çünkü hatırlanması ve okunması kolay. Ama son denemede hatayı yükseltmiyor! – Peder
Bu doğru, ilki çoğu ağ kodu için uygun değildir, ancak istisna kaldırılmaması gerektiğinde kullanılabilir. – glebm
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
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.
begin
#your code
rescue
retry if (_r = (_r || 0) + 1) and _r < 4 # Needs parenthesis for the assignment
raise
end
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.
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
Ve sonra olarak kullanabilirsiniz:
-> { raise 'hi' }.rescue(3)
-> { raise 'hi' }.rescue(3) { |m, n| puts "message: #{m},
number of attempts left: #{n}" }
yerine yeniden deneme, bir 3x döngü içinde bir şey koymak? –
Bir döngüde üç kez tekrar denemek mi istiyorsunuz? – puqt