From: Jan Roslind Date: 2010-02-12T18:35:01+09:00 Subject: Re: Global rescue - DRY (don't repeat yourself) 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 -- Posted via http://www.ruby-forum.com/.