syntax/retry_and_rescue.rb

tests/_examples/syntax/retry_and_rescue.rb in the metorex repository.

# `retry` runs the begin body again from the top. It is only written inside a
# rescue body, and the rescue decides when to stop asking.
attempts = 0
begin
  attempts += 1
  raise "not yet" if attempts < 4
  outcome = :done
rescue
  retry
end
p [attempts, outcome]

# A nested begin retries its own body rather than the one around it.
outer = 0
inner = 0
begin
  outer += 1
  begin
    inner += 1
    raise "inner" if inner < 3
  rescue
    retry
  end
  raise "outer" if outer < 2
rescue
  retry
end
p [outer, inner]

begin
  eval "retry"
rescue SyntaxError => problem
  puts "refused outside a rescue"
end

Output:

[4, :done]
[2, 4]
refused outside a rescue