Bug #11344
closedThread.handle_interrupt(TimeoutError => :never) が効かない
Description
るりま http://docs.ruby-lang.org/ja/2.2.0/method/Thread/s/handle_interrupt.html によると、Thread.handle_interrupt(TimeoutError => :never) で TimeoutError を制御できると書かれていますが、働きません。
require 'timeout'
Thread.handle_interrupt(TimeoutError => :never) do
  timeout(1) do
    sleep 2
    p 'done'
  end
end
#=> sample.rb:4:in `sleep': execution expired (Timeout::Error)
TimeoutError の代わりに Timeout::ExitException を指定すれば働きます。
require 'timeout'
Thread.handle_interrupt(Timeout::ExitException => :never) do
  timeout(1) do
    sleep 2
    p 'done'
  end
end
#=> "done"
#=> sample.rb:2:in `handle_interrupt': execution expired (Timeout::ExitException)
これは意図された挙動でしょうか。
なお、るりまだけじゃなく、thread.c 中のコメントにも同様の記述があります。
        
           Updated by nobu (Nobuyoshi Nakada) over 10 years ago
          Updated by nobu (Nobuyoshi Nakada) over 10 years ago
          
          
        
        
      
      - Status changed from Open to Closed
Applied in changeset r51213.
timeout.rb: removed and use Timeout::Error
- lib/timeout.rb (ExitException): removed internal exception class
 and use Timeout::Error instead, as using throw/catch to isolate
 each timeouts now. [ruby-dev:49179] [Bug #11344]
        
           Updated by nobu (Nobuyoshi Nakada) over 10 years ago
          Updated by nobu (Nobuyoshi Nakada) over 10 years ago
          
          
        
        
      
      - Description updated (diff)
- Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN to 2.0.0: WONTFIX, 2.1: REQUIRED, 2.2: REQUIRED
2.1にはそのままバックポートできるか分かりませんが、REQUIREDにしておきます。
2.0も動作は同じなのですが、throw/catchを使うようにするところからバックポートしないといけないので、とりあえずWONTFIXにしておきます。
        
           Updated by usa (Usaku NAKAMURA) over 10 years ago
          Updated by usa (Usaku NAKAMURA) over 10 years ago
          
          
        
        
      
      本題ではないですが、
2.0.0は脆弱性じゃなければ全部WONTFIXでOKです。
が、いちいち変えるの面倒なので、私も他のを変えるついで以外では変えてませんし、
特に気にせずREQUIREDにして頂いてもかまいません。
(もちろん問題の有無自体がわからなかったらUNKNOWNのままで可)
        
           Updated by nagachika (Tomoyuki Chikanaga) over 10 years ago
          Updated by nagachika (Tomoyuki Chikanaga) over 10 years ago
          
          
        
        
      
      一度は(それも結構長いあいだ) raise する例外が Timeout::ExitException になっていたことから、バックポート時は互換性を考えると ExitException = Timeout::Error とかしておいたほうがいいかなと思いますがどうでしょうか。
        
           Updated by nobu (Nobuyoshi Nakada) over 10 years ago
          Updated by nobu (Nobuyoshi Nakada) over 10 years ago
          
          
        
        
      
      Timeout::ExitExceptionは内部用のクラスという認識でした。:nodoc:だし。
        
           Updated by tommy (Masahiro Tomita) over 10 years ago
          Updated by tommy (Masahiro Tomita) over 10 years ago
          
          
        
        
      
      少なくとも Thread.handle_interrupt では Timeout::Error の指定は効かなかったので、しかたなく内部クラスの Timeout::ExitException を使ってたというライブラリもあるかもしれないので、
互換性を考えると ExitException = Timeout::Error とかしておいたほうがいいかなと思いますがどうでしょうか
に賛成です。
Mysql2 がそんな感じに使っちゃってます。 https://github.com/brianmario/mysql2/blob/master/lib/mysql2/client.rb#L79
まだこの変更はリリース前ですけど。
        
           Updated by nagachika (Tomoyuki Chikanaga) about 10 years ago
          Updated by nagachika (Tomoyuki Chikanaga) about 10 years ago
          
          
        
        
      
      - Backport changed from 2.0.0: WONTFIX, 2.1: REQUIRED, 2.2: REQUIRED to 2.0.0: WONTFIX, 2.1: REQUIRED, 2.2: DONE
r51523 で ruby_2_2 への r51213 の backport + Timeout::ExitException の Timeout::Error の別名として追加を行いました。
        
           Updated by usa (Usaku NAKAMURA) about 10 years ago
          Updated by usa (Usaku NAKAMURA) about 10 years ago
          
          
        
        
      
      - Backport changed from 2.0.0: WONTFIX, 2.1: REQUIRED, 2.2: DONE to 2.0.0: WONTFIX, 2.1: DONE, 2.2: DONE
2.1も2.2と同じ形でbackportしました。(r51603)
        
           Updated by byroot (Jean Boussier) over 2 years ago
          Updated by byroot (Jean Boussier) over 2 years ago
          
          
        
        
      
      - Related to Misc #19740: Block taking methods can't differentiate between a non-local return and a throw added