読者です 読者をやめる 読者になる 読者になる

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