Ruby Timeout::timeout doesn't fire Exception and doesn't return what documented

后端 未结 3 2172
野的像风
野的像风 2021-02-14 09:39

I have this piece of code:

begin
  complete_results = Timeout.timeout(4) do      
    results = platform.search(artist, album_name)
  end
rescue Timeout::Error
           


        
相关标签:
3条回答
  • 2021-02-14 10:16

    Your code is correct

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

    does print out "print me something please".

    Try the basic code as above. If that works, you have an issue in platform.search.

    0 讨论(0)
  • 2021-02-14 10:20

    According to the documentation:

    If the block execution terminates before sec seconds has passed, it returns true. If not, it terminates the execution and raises exception (which defaults to Timeout::Error)

    This means it only returns true if it's successful, otherwise the variable will not be set (ie it's nil NOT false).

    As far as your example goes, it's definitely timing out for me and getting to the rescue part...

    0 讨论(0)
  • 2021-02-14 10:24

    The problem is that platform.search is catching the exception that Timeout#timeout throws.

    You can get around this by wrapping your inner code in another thread -- 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 
    
    0 讨论(0)
提交回复
热议问题