errors/backtrace/frame_labels_no_parens.rb

tests/_examples/errors/backtrace/frame_labels_no_parens.rb in the metorex repository.

# A backtrace names a method on a class with a dot and one on an instance
# with a hash, and a block run against another receiver sits where the call
# was made.
module Held
  class Raiser
    def self.from_a_class_method
      raise "from a class method"
    end

    def from_an_instance_method
      raise "from an instance method"
    end
  end
end

def labels_of(raised)
  raised.backtrace.first(2).map { |entry| entry.split(":in ").last }
end

begin
  Held::Raiser.from_a_class_method
rescue RuntimeError => raised
  p labels_of(raised)
end

begin
  Held::Raiser.new.from_an_instance_method
rescue RuntimeError => raised
  p labels_of(raised)
end

class Runner
  def self.protect(&block)
    Object.new.instance_exec &block
  end
end

seen = nil
Runner.protect { seen = caller(1).first.split(":in ").last }
p seen

Output:

["'Held::Raiser.from_a_class_method'", "'<main>'"]
["'Held::Raiser#from_an_instance_method'", "'<main>'"]
"'BasicObject#instance_exec'"