Net::HTTPの例外補足方法
Net::HTTPは内部でTimeoutを利用しているけども、これのエラー補足までの面倒は見てくれない。
なので必ずrescueで補足してあげる必要がある。
begin Net::HTTP.get(url) rescue puts "exception on HTTP: #{$!}" end
・・・と安直にやりたいところだけれど、ここに落とし穴。
実際にHTTP通信がタイムアウトを起こすとこうなってしまう。
/usr/lib/ruby/1.8/timeout.rb:54:in `rbuf_fill': execution expired (Timeout::Error)
引数無しのrescueはStandardErrorとそのサブクラスしか受け付けてくれない。
error_type が省略された時は StandardError のサブクラスである全ての例外を捕捉します。
プログラミング言語 Ruby リファレンスマニュアル
けれどもTimeout::ErrorはInterruptのサブクラス。
Exception ├StandardError └Interrupt └Timeout::Error
なので、Net::HTTPの例外補足は、きちんと明示するか
rescue Timeout::Error
より広く補足しないといけない。
rescue Exception