Я немного дополню свой комментарий. Вы можете использовать retry
, чтобы вернуться к begin
:
begin
doc = Nokogiri::HTML(open(url).read.strip)
rescue Exception => ex
log.error "Error: #{ex}"
retry
end
Это будет пытаться (и регистрировать ошибки) до тех пор, пока оно не заработает или вы не убьете его вручную. Это, вероятно, не то, что вы хотите, хотя одна маленькая ошибка отправит вас в бесконечный цикл. Самый простой способ - позволить ему попробовать, скажем, 10 раз, а затем сдаться:
MAX_ATTEMPTS = 10
doc = nil
begin
doc = Nokogiri::HTML(open(url).read.strip)
rescue Exception => ex
log.error "Error: #{ex}"
attempts = attempts + 1
retry if(attempts < MAX_ATTEMPTS)
end
if(doc.nil?)
# Do something about the persistent error
# so that you don't try to access a nil
# doc later on.
end
Нечто подобное попробует несколько раз, а затем сдастся. Вы также можете поместить вызов sleep
перед retry
, если хотите немного подождать до следующей попытки или исследовать исключение (возможно, с несколькими блоками rescue
), чтобы выбрать, следует ли вам дать немедленно, подождите и повторите попытку или повторите попытку немедленно.