Home > Memo | Ruby > Timeout::Errorが罠過ぎる

Timeout::Errorが罠過ぎる

RubyのTimeout::ErrorはStanderdErrorじゃないから、単純にrescueを書いただけでは拾ってくれない。
具体的にどういう事かというと

begin
  timeout(1) {
    sleep 10 #long long time work
  }
rescue
  retry
end

とかやってもTimeout::Errorが発生すると、retryされずにスクリプトは例外で落ちる。

begin
  timeout(1) {
    sleep 10 #long long time work
  }
rescue
  retry
rescue Timeout::Error
  retry
end

とすればいい。
が、rescueの中身が同じってとっても気持ち悪いんだけど、どうすればいいかなあ。

追記

よく考えたらスーパークラスなExceptionを指定すればいいじゃん。

begin
  timeout(1) {
    sleep 10 #long long time work
  }
rescue Exception
  retry
end

rescueの後ろを省略すると、StanderdErrorだけ補足すると言うことなのね。

つまり、Timeout::Errorが罠、というよりはrescueが罠ということか。

しかしこうすると、^cでプログラムを落とせなくなるなw

追記2

どうやら、rescue節には複数の例外を書くことができるらしい。(コメント欄参照)

begin
  timeout(1) {
    sleep 10 #long long time work
  }
rescue Timeout::Error, StanderdError
  retry
end

なるほど、こういう事ができるのか。
さすがにしっかり考えられているなぁ

参考URL

Comments:2

keita 08-04-21 (月) 8:41

rescue 節には複数の例外クラスの指定ができるので、次のようにしてはいかがでしょうか。

require “timeout”

begin
timeout(1) {
sleep 10 #long long time work
}
rescue Timeout::Error, StandardError
puts “rescued”
retry
end

これならInterruptは補足されないので安心だと思います。

shunirr 08-04-21 (月) 8:49

>keita
なるほど!
そういうことが出来るんですね。
勉強になります。

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://shunirr.org/archives/115/trackback
Listed below are links to weblogs that reference
Timeout::Errorが罠過ぎる from shunirr.org

Home > Memo | Ruby > Timeout::Errorが罠過ぎる

メタ情報

Return to page top