Sorry - my fault - I should have included a running demo:
class VariableStack
@@variables = []
def self.save_variables (xbinding, xself)
@@variables << [ caller[0], xbinding, xself ]
end # self.save_variables
def self.get_instance_variables (xself)
xself.instance_variables.collect do |name|
value = xself.instance_variable_get(name)
“#{name}=#{value}”
end
end # self.get_instance_variables
def self.dump_variables
puts “Variable dump:”
lng = @@variables.size
0.upto(lng-1) do |i|
xcaller, xbinding, xself = @@variables[i]
xlocal_variables = eval(“local_variables”, xbinding).collect {
|a| “#{a}=#{eval(a, xbinding)}” }.join(’, ‘)
xinstance_variables =
VariableStack.get_instance_variables(xself).join(’, ')
puts “variable_stack/#{i}:”
puts " caller = #{xcaller}"
puts " local variables = #{xlocal_variables}"
puts " instance variables = #{xinstance_variables}"
end # each variables
@@variables = []
end # self.dump_variables
end # VariableStack
class SomeClass1
def self.test1
begin
@some_instance_var1 = 1
some_local_var2 = 0
some_local_var3 = 3
division_by_with_zero = @some_instance_var1 / 0
rescue => e ; VariableStack.save_variables(binding, self) ; raise #
generel rescue clause - used 10.000 times - not wery DRY
end
end # self.test1
end # SomeClass1
class SomeClass2
def self.test2
begin
@some_instance_variable4 = 4
some_local_var5 = 5
SomeClass1.test1
rescue => e ; VariableStack.save_variables(binding, self) ; raise #
generel rescue clause - used 10.000 times - not wery DRY
end
end # self.test2
end # SomeClass2
rails session, batch job or demon proces
begin
@some_instance_variable6 = 6
some_local_var7 = 7
SomeClass2.test2
rescue => e
puts “error = #{e.message.to_s}”
puts “backtrace = #{e.backtrace}”
VariableStack.dump_variables
to-do: bug management system: save error report in database or send
error report as mail
end
Output:
error = divided by 0
backtrace = test.rb:41:in /'test.rb:41:in
test1’test.rb:55:in
test2'test.rb:67 Variable dump: variable_stack/0: caller = test.rb:42:in
test1’
local variables = some_local_var2=0, some_local_var3=3,
division_by_with_zero=, e=divided by 0
instance variables = @some_instance_var1=1
variable_stack/1:
caller = test.rb:56:in `test2’
local variables = some_local_var5=5, e=divided by 0
instance variables = @some_instance_variable4=4
My problem is that I don’t want to repeat
rescue => e ; VariableStack.save_variables(binding, self) ; raise
for every method in my application. It would be much better with
load ‘global_rescue_clause.rb’, but that does not work.
Is there a way to include “row” ruby source code in ruby method, or an
more OO way to get a variable stack with local and instance variables?
Regards
Jan