errors/handled_then_outer.rb

tests/_examples/errors/handled_then_outer.rb in the metorex repository.

# `$!` names the exception being handled. A rescue clause inside a handler
# leaves the outer exception in place once it is done, so the handler that
# follows still names what it is handling.
begin
  raise "outer"
rescue RuntimeError
  p $!.message
  begin
    raise ArgumentError, "inner"
  rescue ArgumentError
    p $!.message
  end
  p $!.message
  p $!.class
end
p $!

# A rescue in a method called from a handler leaves the same thing standing.
def swallowing
  Integer "not a number"
rescue ArgumentError
  :swallowed
end

begin
  raise "again"
rescue RuntimeError
  p swallowing
  p $!.message
end

Output:

"outer"
"inner"
"outer"
RuntimeError
nil
:swallowed
"again"