【问题标题】:Ruby Timeout::timeout doesn't fire Exception and doesn't return what documentedRuby Timeout::timeout 不会触发 Exception 并且不会返回记录的内容
【发布时间】:2011-06-05 22:55:46
【问题描述】:

我有这段代码:

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

然后我启动包含此代码的方法,好吧,这里是堆栈跟踪的开始:

异常消息:执行已过期 异常回溯:/***/****/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:64:i

所以我天真地认为我的通话超时了,但从未打印过“请打印我的东西”,并且complete_results 被认为是超时状态返回值(真或假,如文档中所述),绝对不是布尔值。

我做错了吗?

【问题讨论】:

    标签: ruby-on-rails ruby timeout rescue


    【解决方案1】:

    你的代码是正确的

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

    确实打印出“请给我打印一些东西”。

    试试上面的基本代码。如果可行,您在platform.search 中遇到了问题。

    【讨论】:

    • 你绝对正确。我不知道为什么我没有检查 platform.search。实际上,搜索正在拯救......例外......非常感谢!
    【解决方案2】:

    问题是platform.search 正在捕获Timeout#timeout throws 的异常。

    你可以通过将你的内部代码包装在另一个线程中来解决这个问题——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 
    

    【讨论】:

    【解决方案3】:

    根据the documentation

    如果块执行终止 在 sec 秒过去之前,它 返回真。如果不是,则终止 执行并引发异常 (默认为 Timeout::Error)

    这意味着它只有在成功时才返回true,否则将不会设置变量(即它是nil NOT false)。

    就您的示例而言,这对我来说肯定是超时并进入救援部分......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      相关资源
      最近更新 更多