Forum: Ruby better error reporting from eval?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Fbb4d027695dfdf76bf448b15d7e306a?d=identicon&s=25 matt neuburg (Guest)
on 2009-02-24 17:27
(Received via mailing list)
This might seem silly, but it is only a reduced version of a real issue.
Consider the following:

class Thing
  def ev(what)
    eval(what)
  end
  def bar()
    1 + 1
    nil + 2 # causing an exception in bar()
  end
  def foo
    bar()
  end
end

Thing.new.ev("foo()")

NoMethodError: undefined method `+' for nil:NilClass
method ev
in untitled at line 4
method foo
in untitled at line 11
method ev
in untitled document at line 1
method eval
in untitled at line 15
method ev
in untitled at line 4
at top level
in untitled at line 15

Notice that the error report makes no mention of bar(). This can make
exceptions in an eval difficult to track down. Is there a way to get
better error reporting in an eval? Thx - m.
4d5b5dd4e263d780a5dfe7ac8b8ac98c?d=identicon&s=25 Tim Pease (Guest)
on 2009-02-24 17:41
(Received via mailing list)
On Feb 24, 2009, at 9:24 AM, matt neuburg wrote:

>    nil + 2 # causing an exception in bar()
>  end
>  def foo
>    bar()
>  end
> end
>
> Thing.new.ev("foo()")
>

def ev(what)
   eval(what, binding, __FILE__, __LINE__)
end

You can pass along the filename and the line number that you want
displayed when eval reports errors. The "binding" is simply the
binding of your current Thing instance.

Blessings,
TwP
Fbb4d027695dfdf76bf448b15d7e306a?d=identicon&s=25 matt neuburg (Guest)
on 2009-02-24 20:06
(Received via mailing list)
Tim Pease <tim.pease@gmail.com> wrote:

> >  def bar()
>
> def ev(what)
>    eval(what, binding, __FILE__, __LINE__)
> end
>
> You can pass along the filename and the line number that you want
> displayed when eval reports errors. The "binding" is simply the
> binding of your current Thing instance.

Amazing - just adding the word "binding" (in the actual issue I'm
having) in the eval call does indeed solve the whole problem. Thx! m.
This topic is locked and can not be replied to.