How to know where ERB stopped?

Let's say I've got an ERB template:

text1
<%= thing1() %>
text2
<%= thing2() %>
text3
<%= thing3() %>
text4

But let's say we get an error (exception) during the execution of
thing2(). How can I find out that this is where the error occurred? I
don't want to instrument thing1, thing2, thing3, etc; I'm hoping I can
just find out what ERB was doing when we errored out. Thx - m.

···

--
matt neuburg, phd = matt@tidbits.com, http://www.tidbits.com/matt/
Leopard - http://www.takecontrolbooks.com/leopard-customizing.html
AppleScript - http://www.amazon.com/gp/product/0596102119
Read TidBITS! It's free and smart. http://www.tidbits.com

matt neuburg wrote:

Let's say I've got an ERB template:

text1
<%= thing1() %>
text2
<%= thing2() %>
text3
<%= thing3() %>
text4

But let's say we get an error (exception) during the execution of
thing2(). How can I find out that this is where the error occurred? I
don't want to instrument thing1, thing2, thing3, etc; I'm hoping I can
just find out what ERB was doing when we errored out. Thx - m.

The following code illustrates how this could be accomplished (also
available as a pastie[1]):

  require 'erb'

  def thing1(); "foo" end
  def thing2(); raise Exception.new("Something went wrong") end
  def thing3(); "bar" end

  template = <<ERB
    text1
    <%= thing1() %>
    text2
    <%= thing2() %>
    text3
    <%= thing3() %>
    text4
  ERB

  erb = ERB.new(template)

  begin
    erb.run
  rescue Exception => e
    puts "Exception: #{e}"
    line = e.backtrace.grep(/^\(erb\)/)[0].split(':')[1].to_i
    puts "While evaluating line #{line} of the template:"
    puts template.split("\n")[line-1]
    puts "Backtrace: ", e.backtrace
  end

Hope that helps!

-Matthias

[1]: http://www.pastie.org/422933

···

--
Posted via http://www.ruby-forum.com/\.

Very much so, thank you. Grepping and parsing the backtrace is the exact
clue that I needed. m.

···

Matthias Reitinger <reitinge@in.tum.de> wrote:

matt neuburg wrote:
> Let's say I've got an ERB template:
>
> text1
> <%= thing1() %>
> text2
> <%= thing2() %>
> text3
> <%= thing3() %>
> text4
>
> But let's say we get an error (exception) during the execution of
> thing2(). How can I find out that this is where the error occurred? I
> don't want to instrument thing1, thing2, thing3, etc; I'm hoping I can
> just find out what ERB was doing when we errored out. Thx - m.

The following code illustrates how this could be accomplished (also
available as a pastie[1]):

  require 'erb'

  def thing1(); "foo" end
  def thing2(); raise Exception.new("Something went wrong") end
  def thing3(); "bar" end

  template = <<ERB
    text1
    <%= thing1() %>
    text2
    <%= thing2() %>
    text3
    <%= thing3() %>
    text4
  ERB

  erb = ERB.new(template)

  begin
    erb.run
  rescue Exception => e
    puts "Exception: #{e}"
    line = e.backtrace.grep(/^\(erb\)/)[0].split(':')[1].to_i
    puts "While evaluating line #{line} of the template:"
    puts template.split("\n")[line-1]
    puts "Backtrace: ", e.backtrace
  end

Hope that helps!

--
matt neuburg, phd = matt@tidbits.com, Matt Neuburg’s Home Page
Leopard - http://www.takecontrolbooks.com/leopard-customizing.html
AppleScript - http://www.amazon.com/gp/product/0596102119
Read TidBITS! It's free and smart. http://www.tidbits.com