Нет, это невозможно, поскольку 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
заранее и не дать сбою кода вообще. Но я думаю, это всего лишь пример, а ваш реальный код более сложный.