Backtrace retry only провалила рельсы содержимого строки - PullRequest
0 голосов
/ 03 апреля 2020

Не уверен, что это возможно или нет. В начале и спасении я хочу повторить только неудачную строку, а не весь метод в ruby на рельсах, это возможно?

def do_division_by_zero
  puts "start"
  puts (@ssp + 5).to_s
end

retries = 0
begin
  do_division_by_zero
rescue => e
  if (retries += 1) <= 3
    puts "Timeout (#{e}), retrying in #{retries} second(s)..."
    sleep(2)
    @ssp = 6 if retries == 2
    retry
  else
    e.backtrace.first(3) { |line| Rails.logger.error line }
  end
end

Вывод: -

start
Timeout (undefined method `+' for nil:NilClass), retrying in 1 second(s)...
start
Timeout (undefined method `+' for nil:NilClass), retrying in 2 second(s)...
start
11

Ожидаемый вывод: -

start
Timeout (undefined method `+' for nil:NilClass), retrying in 1 second(s)...
Timeout (undefined method `+' for nil:NilClass), retrying in 2 second(s)...
11

Я хочу повторить только неудачную строку, а не весь метод, возможно ли в ruby на рельсах?

1 Ответ

0 голосов
/ 03 апреля 2020

Нет, это невозможно, поскольку retry возвращается к началу блока (к begin в этом примере). См. docs .

Если вы хотите, чтобы retry начинался с указанной строки c, тогда вы должны структурировать свой код так, чтобы только строка, которая может завершиться с ошибкой, находилась в begin ... rescue block.

В вашем примере вы можете перестроить его следующим образом:

retries = 0
puts "start"

begin
  puts (@ssp + 5).to_s
rescue => e
  if (retries += 1) <= 3
    puts "Timeout (#{e}), retrying in #{retries} second(s)..."
    sleep(2)
    @ssp = 6 if retries == 2
    retry
  else
    e.backtrace.first(3) { |line| Rails.logger.error line }
  end
end

Обратите внимание, что исключения являются очень дорогими операциями, и поэтому стоит их избегать, если это возможно. В этом примере было бы очень просто просто проверить @ssp заранее и не дать сбою кода вообще. Но я думаю, это всего лишь пример, а ваш реальный код более сложный.

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