Bindings at the time of Exceptions

Discussion in 'Ruby' started by Adam Sanderson, Aug 11, 2005.

  1. 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
     
    Adam Sanderson, Aug 11, 2005
    #1
    1. Advertisements

  2. 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"]
     
    Joel VanderWerf, Aug 11, 2005
    #2
    1. Advertisements

  3. 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
     
    Joel VanderWerf, Aug 11, 2005
    #3
  4. 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
    See Joel's solution.

    Kind regards

    robert
     
    Robert Klemme, Aug 11, 2005
    #4
  5. 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.
     
    Lothar Scholz, Aug 11, 2005
    #5
  6. 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
     
    Adam Sanderson, Aug 11, 2005
    #6
    1. Advertisements

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 (here). After that, you can post your question and our members will help you out.