From: merch-redmine@... Date: 2019-05-29T15:24:34+00:00 Subject: [ruby-core:92883] [Ruby trunk Bug#15886] return in rescue block breaks Timeout.timeout Issue #15886 has been updated by jeremyevans0 (Jeremy Evans). Status changed from Open to Rejected I don't believe this is a bug or specifically related to `Timeout` (or to the other issues you linked). If an exception is raised and an `ensure` or a `rescue` block does an explicit `return` (or a non-local exit such as `throw`), the exception is ignored: ```ruby def a yield ensure return :x end a { raise } # => :x ``` Ruby programmers should be careful about use of explicit returns or non-local exits in `rescue`/`ensure` blocks. ---------------------------------------- Bug #15886: return in rescue block breaks Timeout.timeout https://bugs.ruby-lang.org/issues/15886#change-78262 * Author: moio (Silvio Moioli) * Status: Rejected * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu] * Backport: 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN ---------------------------------------- Passing `Timeout.timeout` a block with a rescue clause that contains a return statement prevents `Timeout::Error` to be raised as expected. Reproducer: ``` ruby require 'timeout' begin Timeout.timeout(1) do begin sleep 10 ensure puts "ensure block executed" ## commenting line below restores expected behaviour return true end end rescue Timeout::Error => e puts "EXPECTED BEHAVIOUR: timeout error rescued" end ``` Expected output: ``` ensure block executed EXPECTED BEHAVIOR: timeout error rescued ``` Actual output: ``` ensure block executed ``` Looking in Redmine the following two issues appear related (but I lack the insight to tell for sure): - https://bugs.ruby-lang.org/issues/14859 - https://bugs.ruby-lang.org/issues/7503 I apologize in advance if this issue is a duplicate. -- https://bugs.ruby-lang.org/ Unsubscribe: