begin
#some routine
rescue
retry
#on third retry, output "no dice!"
end
Tôi muốn làm như vậy để thử lại "thứ ba", in một tin nhắn.ruby: làm thế nào để biết nếu kịch bản là trên thử lại lần thứ 3?
begin
#some routine
rescue
retry
#on third retry, output "no dice!"
end
Tôi muốn làm như vậy để thử lại "thứ ba", in một tin nhắn.ruby: làm thế nào để biết nếu kịch bản là trên thử lại lần thứ 3?
Có thể không phải là giải pháp tốt nhất, nhưng cách đơn giản chỉ là tạo biến 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
hoặc
k = 0
begin
do_stuff
rescue
k += 1
k < 3 ? retry : raise
end
Câu trả lời hay nhất ... – DigitalRoss
Tôi thích lựa chọn thay thế đầu tiên vì dễ nhớ và dễ đọc. Nhưng nó không làm tăng lỗi trong lần thử cuối cùng! – Peder
Đúng vậy, cái đầu tiên không phù hợp với hầu hết mã mạng, nhưng nó có thể được sử dụng khi không có ngoại lệ. – 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
Các đá quý attempt được thiết kế cho điều này, và cung cấp tùy chọn chờ đợi giữa nỗ lực. Tôi đã không sử dụng nó bản thân mình, nhưng nó có vẻ là một ý tưởng tuyệt vời.
Nếu không, đó là loại khối điều nổi bật, như những người khác đã chứng minh.
begin
#your code
rescue
retry if (_r = (_r || 0) + 1) and _r < 4 # Needs parenthesis for the assignment
raise
end
Có một loại đá quý khác có tên retry-this giúp bạn làm như vậy.
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
Điều tốt về đá quý như trái ngược với phần bắt đầu thô ... ví dụ là chúng ta có thể tránh vòng lặp vô hạn hoặc giới thiệu biến chỉ cho mục đích này.
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
Và sau đó bạn có thể sử dụng nó như:
-> { raise 'hi' }.rescue(3)
-> { raise 'hi' }.rescue(3) { |m, n| puts "message: #{m},
number of attempts left: #{n}" }
Thay vì thử lại, đặt điều trong một vòng lặp 3.times? –
bạn có nghĩa là thử lại trong vòng lặp ba lần? – puqt