2009-11-17 25 views

Trả lời

18

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 
10
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 
+0

Câu trả lời hay nhất ... – DigitalRoss

+1

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

+1

Đú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

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

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.

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

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.

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 

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}" } 
Các vấn đề liên quan