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