RUBY中保存异常现场
无法接触到服务器,但有些问题需要异常的数据,虽然可以在抛出异常时把数据给手动打印到日记,感觉太麻烦了
记得有看豆瓣的架构时,有提到他们在发生异常时,会把当时的所有变量都打印到日记里,方便调试.
在RUBY中实现这个也不难,稍微有点难的是本地变量的保存
实例变量已经在RAILS已经有现在的实现了
# File activesupport/lib/active_support/core_ext/object/instance_variables.rb, line 12 def instance_values #:nodoc: Hash[instance_variables.map { |name| [name.to_s[1..-1], instance_variable_get(name)] }] end
但没有找到local_values这个方法,好吧,我们自己来实现一个
def local_values(context, black_list = []) black_list.concat(%w[local_value_hashs]) context.eval <<-EOS local_value_hashs = {} local_variables.each do |var_name| next if [#{black_list.map{|b|"'#{b}'"}.join ','}].include? var_name local_value_hashs[var_name] = eval(var_name) end local_value_hashs EOS end
require 'pp'class Kitty def hello str = "hello kitty" raise 'test kitty' rescue pp local_values(binding) end def local_values(context, black_list = []) black_list.concat(%w[local_value_hashs]) context.eval <<-EOS local_value_hashs = {} local_variables.each do |var_name| next if [#{black_list.map{|b|"'#{b}'"}.join ','}].include? var_name local_value_hashs[var_name] = eval(var_name) end local_value_hashs EOS endendKitty.new.hello