2011-01-09 15 views
9

tôi có đoạn mã này:của Ruby Timeout :: timeout không làm Exception lửa và không trả lại những gì ghi nhận

begin 
    complete_results = Timeout.timeout(4) do  
    results = platform.search(artist, album_name) 
    end 
rescue Timeout::Error 
    puts 'Print me something please' 
end 

sau đó tôi khởi động phương thức chứa mã này, và tốt, đây là sự khởi đầu của dấu vết ngăn xếp:

 
Exception message : execution expired 
Exception backtrace : /***/****/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:64:i 

Vì vậy, tôi ngây thơ nghĩ rằng cuộc gọi của tôi đã hết thời gian chờ. Nhưng 'In cho tôi một cái gì đó xin vui lòng' không bao giờ được in và complete_results được cho là giá trị trả về thời gian chờ (đúng hoặc sai, như được đề cập trong tài liệu), chắc chắn không phải là một boolean.

Tôi có làm gì sai không?

Trả lời

19

Mã của bạn là đúng

require 'timeout' 
begin 
    complete_results = Timeout.timeout(1) do  
    sleep(2) 
    end 
rescue Timeout::Error 
    puts 'Print me something please' 
end 

không in ra "in một cái gì đó tôi xin vui lòng".

Hãy thử mã cơ bản như trên. Nếu điều đó có hiệu quả, bạn gặp sự cố trong số platform.search.

+0

Bạn hoàn toàn đúng. Tôi không biết tại sao tôi không kiểm tra platform.search. Trên thực tế, tìm kiếm đã được giải cứu .. Ngoại lệ ... Cảm ơn rất nhiều! – Pasta

1

Theo the documentation:

Nếu việc thực hiện khối chấm dứt trước giây giây đã trôi qua, nó trả về true. Nếu không, nó chấm dứt việc thực hiện và làm tăng ngoại lệ (mặc định là Timeout :: Lỗi)

Điều này có nghĩa nó chỉ trả về true nếu nó thành công, nếu không thì biến sẽ không được thiết lập (tức là nó là nil KHÔNG sai).

Theo như ví dụ của bạn đi, nó chắc chắn thời gian ra cho tôi và nhận được đến phần cứu hộ ...

4

Vấn đề là platform.search đang thu hút sự ngoại lệ mà Timeout#timeout throws.

Bạn có thể giải quyết vấn đề này bằng cách gói mã bên trong của bạn vào một chuỗi khác - YMMV.

begin 
    complete_results = Timeout.timeout(4) do 
    Thread.new{ results = platform.search(artist, album_name) }.value 
    end 
rescue Timeout::Error 
    puts 'Print me something please' 
end 
+1

Timeout :: timeout sucks again ... – rogerdpack

+2

Gần đây tôi đã mô tả và, có thể, đã khắc phục sự cố này, tại đây: http://code.jjb.cc/2012/09/15/sane_timeout-a-replacement-for-rubys- standard-library-timeout/ –

+0

Hết thời gian chờ, nhưng cách tiếp cận Threaded này hoạt động tốt, nhờ –