Bindings at the time of Exceptions

A

Adam Sanderson

I always thought it would be neat to be able to get the binding at the
time an exception was raised so that one could see the state the stack
was in when an exception occurred.

It would be nice list the local variables and values at the time of the
exception for instance. Can anyone think of some trickery to do this?
I think it would be of great use for debugging and whatnot, and
massive points for cool ruby hackery ;)
.adam sanderson
 
J

Joel VanderWerf

Adam said:
I always thought it would be neat to be able to get the binding at the
time an exception was raised so that one could see the state the stack
was in when an exception occurred.

It would be nice list the local variables and values at the time of the
exception for instance. Can anyone think of some trickery to do this?
I think it would be of great use for debugging and whatnot, and
massive points for cool ruby hackery ;)
.adam sanderson

No trickery, but you do have to have the cooperation of the code which
raises:


def foo
a = "value of a"
raise StandardError, binding
end

def bar
foo
rescue => e
return e.message
end

b = bar

p b

p eval("a", b)
p eval("local_variables", b)

__END__

output:

#<Binding:0xb7e31a5c>
"value of a"
["a"]
 
J

Joel VanderWerf

Joel said:
No trickery, but you do have to have the cooperation of the code which
raises:

And just for fun, because it's late here...

def foo
a = "value of a"
cc = nil
callcc{|cc|}
if a
raise StandardError, binding
else
return "normally"
end
end

def bar
foo
rescue => e
return e.message
end

b = bar

case b
when Binding
eval("a=nil", b)
eval("cc", b).call
else
puts "Exiting #{b}"
end
 
R

Robert Klemme

Adam said:
I always thought it would be neat to be able to get the binding at the
time an exception was raised so that one could see the state the stack
was in when an exception occurred.

Note, that you can view the stack trace already with standard means:

10:11:06 [c]: ruby -e 'def f() raise "error" end; begin;f;rescue Exception
=> e; puts e.backtrace; end'
-e:1:in `f'
-e:1
It would be nice list the local variables and values at the time of
the exception for instance. Can anyone think of some trickery to do
this? I think it would be of great use for debugging and whatnot, and
massive points for cool ruby hackery ;)
.adam sanderson

See Joel's solution.

Kind regards

robert
 
L

Lothar Scholz

Hello Adam,

AS> I always thought it would be neat to be able to get the binding at the
AS> time an exception was raised so that one could see the state the stack
AS> was in when an exception occurred.

AS> It would be nice list the local variables and values at the time of the
AS> exception for instance. Can anyone think of some trickery to do this?
AS> I think it would be of great use for debugging and whatnot, and
AS> massive points for cool ruby hackery ;)
AS> .adam sanderson

Yes indeed and it is not possible with standart ruby at the moment.

But if you want it, then download ArachnoRuby from http://www.ruby-ide.com.

It just does what you want and it also automatically starts a post mortem
debugger when an unhandled exception terminats the program. So it is
easy to inspect the values.
 
A

Adam Sanderson

Well that's the trick of course ;) Being able to view the variables
without explicity entering the binding when you create the exception.

I tried to think of some way to overide raise in the Kernel and add
some functionality to Exception, but didn't really get anywhere.
.adam
 

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

Similar Threads


Members online

Forum statistics

Threads
473,768
Messages
2,569,575
Members
45,053
Latest member
billing-software

Latest Threads

Top