書き方に統一感が全く無いのは、全く違うときに書いたためです。そのうち書き直します。
手抜き版
def nokogiri_wrapper(&nokogiri) nokogiri.call rescue puts "error in Nokogiri..retry" sleep 1 retry end
使い方
doc = nokogiri_wrapper { Nokogiri::HTML.parse(open(url)) }
ちょっとマシ版
def open_uri_error_retry(&nokogiri_process) retry_count = 0 begin result = yield rescue OpenURI::HTTPError, Errno::ECONNRESET, Errno::ETIMEDOUT => ex if retry_count <= 5 log.error "#{ex.message} retry..." sleep 1 retry else log.error ex.message end rescue => ex log.error ex end result end
使い方
doc = open_uri_error_retry { Nokogiri::HTML.parse(open(url)) }