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
- Newer: Twitterのクラスタを可視化したいな
- Older: 共有フォルダにPDFを入れると印刷してくれるソリューションを作ったよ
Comments:2
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