Logan Capaldo
10/5/2006 12:19:00 AM
On Wed, Oct 04, 2006 at 10:50:05PM +0900, Trans wrote:
> I feel like I should know how to do this already, but... How do I get
> the context in which an error was thrown?
>
> x = SomeClass
>
> def dosomething
> x.bar
> end
>
> begin
> dosomething
> rescue NoMethodError
> p e.context #=> SomeClass (HOW?)
> end
>
> Thanks,
> T.
>
I don't know if there is a builtin way but:
class Object
alias lmc_ruby_raise raise
def raise(*args)
if args.length >= 2
# class + some args
klass, *rem_args = args
exp = klass.new(*rem_args)
exp.instance_variable_set("@context", self.class)
lmc_ruby_raise(exp)
elsif args.length == 1
case args[0]
when Class
exp = args[0].new
exp.instance_variable_set("@context", self.class)
lmc_ruby_raise( exp )
when String
exp = RuntimeError.new(args[0])
exp.instance_variable_set("@context", self.class)
lmc_ruby_raise( exp )
else
exp = args[0]
exp.instance_variable_set("@context", self.class)
lmc_ruby_raise( exp )
end
end
end
end
class Exception
attr_reader :context
end
Totally untested of course.