This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.

Generating and Understanding Tracebacks
CodeExpectedActual
def raise_exception
  raise Exception, 'You wanted me to raise an exception, so...'
end
begin
  raise_exception
rescue Exception => e
  puts "Backtrace of the exception:\n #{e.backtrace.join("\n ")}"
end
Backtrace of the exception:
(irb):2:in `raise_exception'
(irb):5:in `irb_binding'
/usr/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'
:0
Backtrace of the exception:
 (irb):2:in `raise_exception'
 (irb):5:in `irb_binding'
 /usr/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'
 /usr/lib/ruby/1.8/irb/workspace.rb:52
CALLER_RE = /(.*):([0-9]+)(:in \`(.*)')?/
def parse_caller(l)
  l.collect do |c|
    captures = CALLER_RE.match(c)
    [captures[1], captures[2], captures[4]]
  end
end
begin
  raise_exception
rescue Exception => e
  puts "Exception history:"
  first = true
  parse_caller(e.backtrace).each do |file, line, method|
    puts %{ #{first ? "L" : "because l"}ine #{line} in "#{file}"} +
         %{ called "#{method}" }
    first = false
  end
end
Exception history:
Line 2 in "(irb)" called "raise_exception"
because line 24 in "(irb)" called "irb_binding"
because line 52 in "/usr/lib/ruby/1.8/irb/workspace.rb" called "irb_binding"
because line 0 in "" called ""
Exception history:
 Line 2 in "(irb)" called "raise_exception" 
 because line 17 in "(irb)" called "irb_binding" 
 because line 52 in "/usr/lib/ruby/1.8/irb/workspace.rb" called "irb_binding" 
 because line 52 in "/usr/lib/ruby/1.8/irb/workspace.rb" called ""