ruby で rbuf_fill (Timeout::Error)を rescue する

ruby でこんなエラーが・・・rescue していたはずなのに・・・

...ruby/1.8/timeout.rb:60:in `rbuf_fill': execution expired (Timeout::Error)

参考サイト(元ネタ&英語)
http://lindsaar.net/2007/12/9/rbuf_filltimeout-error

調べた結果,
http://www.ruby-lang.org/ja/man/html/_C0A9B8E6B9BDC2A4.html#rescue.bd.a4.be.fe.bb.d2
には,

捕捉する例外クラスを指定することはできません。 (つまり、StandardError 例外クラスのサブクラスだけしか捕捉できません)

とある.StandardError・・・何それ?ということで
http://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFA5AFA5E9A5B9A1BFA5E2A5B8A5E5A1BCA5EBA1BFCEE3B3B0A5AFA5E9A5B9.html#a.ce.e3.b3.b0.a5.af.a5.e9.a5.b9
にありました.

Timeout::Error は Interrupt を継承しているため,次のままでは rescue できません.

begin
  # ここに処理
rescue => ex
  puts ex.class
end

そこで次のようにします.

begin
  # ここに処理
rescue Timeout::Error => ex
  puts ex.class
end

これで rescue!!
Timeout::Errorのかわりに Interrupt と書いてもできました.

しかしこのままでは StandardError を rescue できないので,下のようにもできます.

begin
  # ここに処理
rescue => ex
  puts ex.class
rescue Timeout::Error => ex
  puts ex.class
end

これで rescue できるはずです.