Ruby Timeout在2.0和2.1之间的行为不同

Ruby Timeout在2.0和2.1之间的行为不同,ruby,ruby-2.0,ruby-2.1,Ruby,Ruby 2.0,Ruby 2.1,以下代码在ruby 2.0和2.1之间的行为不同: require 'timeout' def scp begin puts "In begin" sleep 10 rescue Exception => e puts "Exception found: #{e}" else puts "No exception found" ensure puts "In ensure" end end Timeout::timeout(1

以下代码在ruby 2.0和2.1之间的行为不同:

require 'timeout'

def scp
  begin
    puts "In begin"
    sleep 10
  rescue Exception => e
    puts "Exception found: #{e}"
  else
    puts "No exception found"
  ensure
    puts "In ensure"
  end
end

Timeout::timeout(1) do
  scp
end
在ruby 2.0中,它提供:

In begin
Exception found: execution expired
In ensure
In begin
In ensure
t2.rb:7:in `sleep': execution expired (Timeout::Error)
    from t2.rb:7:in `scp'
    from t2.rb:18:in `block in <main>'
    from /usr/local/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:91:in `block in timeout'
    from /usr/local/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:35:in `block in catch'
    from /usr/local/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:35:in `catch'
    from /usr/local/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:35:in `catch'
    from /usr/local/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:106:in `timeout'
    from t2.rb:17:in `<main>'
在ruby 2.1中,它提供了:

In begin
Exception found: execution expired
In ensure
In begin
In ensure
t2.rb:7:in `sleep': execution expired (Timeout::Error)
    from t2.rb:7:in `scp'
    from t2.rb:18:in `block in <main>'
    from /usr/local/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:91:in `block in timeout'
    from /usr/local/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:35:in `block in catch'
    from /usr/local/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:35:in `catch'
    from /usr/local/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:35:in `catch'
    from /usr/local/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:106:in `timeout'
    from t2.rb:17:in `<main>'
开始
确保
t2.rb:7:处于“睡眠”状态:执行已过期(超时::错误)
从t2.rb:7:in'scp'
从t2.rb:18:in'block in'
from/usr/local/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:91:in'block in timeout'
from/usr/local/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:35:in'block in catch'
from/usr/local/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:35:in'catch'
from/usr/local/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:35:in'catch'
from/usr/local/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/timeout.rb:106:in'timeout'
从t2.rb:17:in`'

为什么它们不同?

这是记录在案的行为。我们可以比较Ruby的Timeout模块和的文档。2.1.0的文档说明:

除非明确给出klass,否则无法在块内拯救为终止给定块而引发的异常


如果希望在应用程序中使用旧的行为,可以调用
Timeout::Timeout(1,Timeout::Error)
。这将允许您捕获定时块内的异常。

这是记录在案的行为。我们可以比较Ruby的Timeout模块和的文档。2.1.0的文档说明:

除非明确给出klass,否则无法在块内拯救为终止给定块而引发的异常


如果希望在应用程序中使用旧的行为,可以调用
Timeout::Timeout(1,Timeout::Error)
。这将允许您捕获定时块内的异常。

我正在Linux上测试Ruby 2.2.3,得到的行为与Ruby 2.1相同。我还看到
Timeout::Error.new.is_a?(异常)
等于true。我正在Linux上测试Ruby 2.2.3,得到了与Ruby 2.1相同的行为。我还看到
Timeout::Error.new.is_a?(异常)
等于true。真奇怪。这一变化没有受到太多评论。我不确定它是否真的有多大帮助。我很好奇,看看最新的JRuby9K是否有2.1.0的行为……真奇怪。这一变化没有受到太多评论。我不确定它是否真的有多大帮助。我很好奇,看看最新的JRuby 9k是否有2.1.0行为。。。