BetterErrors / better_errors

Better error page for Rack apps
MIT License
6.88k stars 437 forks source link

Exceptions when trying to YAML.dump, YAML.load exception when using better_errors #332

Open justin808 opened 8 years ago

justin808 commented 8 years ago

I'm working on code that uses rails attribute serializers, and exception objects are serialized.

[7] (pry) main: 0> begin
[7] (pry) main: 0*   raise RuntimeError.new("something")
[7] (pry) main: 0* rescue => ex
[7] (pry) main: 0*   exx = ex
[7] (pry) main: 0* end
#<RuntimeError: something>
[8] (pry) main: 0> exx
#<RuntimeError: something>
[9] (pry) main: 0> exx.message
"something"
[11] (pry) main: 0> dddd = YAML.dump(exx)
"--- !ruby/exception:RuntimeError\nmessage: something\n__better_errors_bindings_stack:\n- !ruby/object:Binding\n  iseq: &1 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &2 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &3 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &4 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &5 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &6 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &7 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &8 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &9 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &10 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &11 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &12 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &13 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &14 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &15 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &16 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &17 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &18 !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: &19 !ruby/object:RubyVM::InstructionSequence {}\nrescue_bindings:\n- !ruby/object:Binding\n  iseq: !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: !ruby/object:RubyVM::InstructionSequence {}\n- !ruby/object:Binding\n  iseq: *1\n- !ruby/object:Binding\n  iseq: *2\n- !ruby/object:Binding\n  iseq: *3\n- !ruby/object:Binding\n  iseq: *4\n- !ruby/object:Binding\n  iseq: *5\n- !ruby/object:Binding\n  iseq: *6\n- !ruby/object:Binding\n  iseq: *7\n- !ruby/object:Binding\n  iseq: *8\n- !ruby/object:Binding\n  iseq: *9\n- !ruby/object:Binding\n  iseq: *10\n- !ruby/object:Binding\n  iseq: *11\n- !ruby/object:Binding\n  iseq: *12\n- !ruby/object:Binding\n  iseq: *13\n- !ruby/object:Binding\n  iseq: *14\n- !ruby/object:Binding\n  iseq: *15\n- !ruby/object:Binding\n  iseq: *16\n- !ruby/object:Binding\n  iseq: *17\n- !ruby/object:Binding\n  iseq: *18\n- !ruby/object:Binding\n  iseq: *19\nrescue_cause: \n"
[12] (pry) main: 0> YAML.load(dddd)
TypeError: allocator undefined for Binding
from /gems/psych-2.0.17/lib/psych/visitors/to_ruby.rb:372:in `allocate'

A possible workaround before serializing:

    if ex.instance_variable_get(:@__better_errors_bindings_stack)
      ex.remove_instance_variable(:@__better_errors_bindings_stack)
    end
seanders commented 8 years ago

Just to add a data point, I'm running into this exact issue. I'm simply working around dumping the entire exception, but I'm curious if this library intends to support dumping/loading of the exception.