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 できるはずです.