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]のエラートラップのように