methods/yield_in_method_clauses.rb

tests/_examples/methods/yield_in_method_clauses.rb in the metorex repository.

# A method's own rescue, else and ensure clauses belong to its body, so
# `yield` there hands values to the block the method was called with.
def recovering
  raise(ArgumentError, "first try")
rescue ArgumentError => error
  yield(error.message)
end

def finishing
  :body
ensure
  yield(:ensure)
end

def succeeding
  :body
rescue
  :never
else
  yield(:else)
end

p(recovering { |message| "recovered from #{message}" })
p(finishing { |where| puts("ran in #{where}") })
p(succeeding { |where| "answered from #{where}" })

Output:

"recovered from first try"
ran in ensure
:body
"answered from else"