Ruby - исполнение истекло - PullRequest
7 голосов
/ 14 июня 2011

У меня есть такой код:

begin
  doc = Nokogiri::HTML(open(url).read.strip)
rescue Exception => ex
  log.error "Error: #{ex}"
end

И я получаю журнал как:

ERROR -- : Error: execution expired

Я хочу повторное выполнение блока до его успешного завершения.

Как я могу это сделать?

1 Ответ

24 голосов
/ 14 июня 2011

Я немного дополню свой комментарий. Вы можете использовать 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), чтобы выбрать, следует ли вам дать немедленно, подождите и повторите попытку или повторите попытку немедленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...