2009-02-17 rubyのTimeout::Errorははまりやすい
■[ruby] Timeout::Errorに注意
rubyのTimeout::Errorにはまってしまったので、記録しておきます。
net/httpを使ってWebサーバに接続するデーモンプログラムを書いていました。例外はすべてキャッチするつもりでrescueを書いていました。
require 'net/http' begin Net::HTTP.start("www.foo") do |http| ... end rescue =>e # エラータイプを省略 ... end
しかし、net/httpではTimeout::Error例外を発生させるではありませんか。
しかもさらに悪いことに、接続先のサーバはめったにタイムアウトしないのでTimeout::Errorが発生することに気がつきませんでした。
いろいろ調べてみると、
- rescueはエラータイプを省略するとStandartErrorのサブクラスの例外を捕捉する
- Timeout::ErrorはInterruptを継承したクラスでStanderErrorには属していない
- net/httpなどのライブラリはtimeout.rbを使っている
- gemでインストールしているライブラリもtimeout.rbを使っている
今後、例外をすべてキャッチするつもりでコーディングするときは、下記のテンプレートを使っていこうと思います。
begin .... rescue Timeout::Error, StandardError =>e end
トラックバック - http://d.hatena.ne.jp/dreammind/20090217/1234813224
リンク元
- 80 http://www.google.co.jp/search?q=eclipse.ini&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox
- 34 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=7na&q=wireshark+VISTA&btnG=検索&lr=lang_ja
- 28 http://www.google.co.jp/search?hl=ja&q=eclipse.ini&btnG=Google+検索&meta=lr=&aq=f
- 21 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4ADBR_jaJP207JP225&q=eclipse+ini
- 15 http://www.google.co.jp/search?hl=ja&q=eclipse.ini&meta=lr=&aq=0
- 13 http://www.google.co.jp/search?q=eclipse.ini&sourceid=navclient-ff&ie=UTF-8&rls=GGGL,GGGL:2006-38,GGGL:ja&aq=t
- 11 http://d.hatena.ne.jp/lynmock/20090128/p1
- 11 http://www.google.co.jp/search?q=eclipse.ini&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:unofficial&client=firefox-a
- 11 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=Wireshark+Vista&num=50
- 10 http://www.google.co.jp/search?hl=ja&q=eclipse.ini&lr=lang_ja