how to know where ERB stopped?

M

matt neuburg

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.
 
M

Matthias Reitinger

matt said:
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
 
M

matt neuburg

Matthias Reitinger said:
matt said:
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!

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

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,598
Members
45,149
Latest member
Vinay Kumar Nevatia0
Top