Timeout::Errorが罠過ぎる
Ruby の Timeout::Error は StandardError じゃないから、単純に 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 の後ろを省略すると、StandardError だけ補足すると言うことなのね。
つまり、Timeout::Error が罠、というよりは rescue が罠ということか。
しかしこうすると、^c でプログラムを落とせなくなるな w
追記 2
どうやら、rescue 節には複数の例外を書くことができるらしい。(コメント欄参照)
begin
timeout(1) {
sleep 10 #long long time work
}
rescue Timeout::Error, StandardError
retry
end
なるほど、こういう事ができるのか。
さすがにしっかり考えられているなぁ