From ba57274860e05b2738419d462464a699d3ef4463 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 27 Aug 2013 08:18:50 +0000 Subject: [PATCH] timeout.rb: raise given exception * lib/timeout.rb (Timeout#timeout): skip rescue clause only when no exception class is given. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42710 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ lib/timeout.rb | 11 +++++++---- test/test_timeout.rb | 16 +++++++++++++++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index da8beb82b2..b1937ed34e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Tue Aug 27 17:18:40 2013 Nobuyoshi Nakada + + * lib/timeout.rb (Timeout#timeout): skip rescue clause only when no + exception class is given. + Tue Aug 27 17:02:58 2013 Nobuyoshi Nakada * io.c (copy_stream_body): should write in binary mode. based on a diff --git a/lib/timeout.rb b/lib/timeout.rb index 97af8547f4..cf46c1db66 100644 --- a/lib/timeout.rb +++ b/lib/timeout.rb @@ -62,7 +62,9 @@ module Timeout # a module method, so you can call it directly as Timeout.timeout(). def timeout(sec, klass = nil) #:yield: +sec+ return yield(sec) if sec == nil or sec.zero? - bt = catch(ExitException.new) do |exception| + message = "execution expired" + e = Error + bt = catch((klass||ExitException).new) do |exception| begin x = Thread.current y = Thread.start { @@ -71,11 +73,12 @@ module Timeout rescue => e x.raise e else - # no message, not to make new instance. - x.raise exception + x.raise exception, message end } return yield(sec) + rescue (klass||ExitException) => e + e.backtrace ensure if y y.kill @@ -89,7 +92,7 @@ module Timeout while THIS_FILE =~ bt[level] bt.delete_at(level) end - raise((klass||Error), "execution expired", bt) + raise(e, message, bt) end module_function :timeout diff --git a/test/test_timeout.rb b/test/test_timeout.rb index 4c6065c232..9d51ca5be3 100644 --- a/test/test_timeout.rb +++ b/test/test_timeout.rb @@ -33,7 +33,7 @@ class TestTimeout < Test::Unit::TestCase def test_skip_rescue bug8730 = '[Bug #8730]' e = nil - assert_raise(Timeout::Error, bug8730) do + assert_raise_with_message(Timeout::Error, /execution expired/, bug8730) do timeout 0.1 do begin sleep 3 @@ -43,4 +43,18 @@ class TestTimeout < Test::Unit::TestCase end assert_nil(e, bug8730) end + + def test_rescue_exit + exc = Class.new(RuntimeError) + e = nil + assert_nothing_raised(exc) do + timeout 0.1, exc do + begin + sleep 3 + rescue exc => e + end + end + end + assert_raise_with_message(exc, /execution expired/) {raise e if e} + end end