net/httpの例外捕捉方法(2)

先日のNet::HTTPの例外補足方法

rescue Timeout::Error

だけではエラーを捕捉しきれませんでした。*1

たしかErrnoの何かかEOFErrorだったはずなのですが、うっかりエラーメッセージを記録しわすれてしまったうえに、サーバの調子が悪い時にしかお目にかからないのでなかなか再現できません。


あれこれぐぐってみると、EOFErrorもErrnoも起きるような雰囲気。rescue Timeout::Error を指定するときには rescue もしくは rescue Exception の併用が欠かせませんね。

begin
  Net::HTTP.get(url)
rescue
  puts "exception on HTTP: StandardError #{$!}"
rescue Timeout::Error
  puts "exception on HTTP: TimeoutError"
rescue Exception
  puts "exception on HTTP: #{$!}"
end

2007/04/10追記

StandardError系とTimeout:Error以外の例外は通常のnet/httpでは出ないのかもしれません。もしそうならExceptionは「予期せぬ例外」になるので、もっと上位の部分(いわゆるmain関数やそれに近い所*2)で捕捉したほうが適切になりそうです。
後日もう少し調べてみます。

*1:当たり前といえば当たり前なのですが…。

*2:例えばHikiのhiki.cgi]のエラートラップのように