`
cxh116
  • 浏览: 76801 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

RUBY中保存异常现场

阅读更多
  无法接触到服务器,但有些问题需要异常的数据,虽然可以在抛出异常时把数据给手动打印到日记,感觉太麻烦了
 
  记得有看豆瓣的架构时,有提到他们在发生异常时,会把当时的所有变量都打印到日记里,方便调试.

  在RUBY中实现这个也不难,稍微有点难的是本地变量的保存

  实例变量已经在RAILS已经有现在的实现了
引用
http://apidock.com/rails/Object/instance_values

# 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


这个方法默认只需要一个参数,context参数在发生异常的rescue语句里调用binding方法,black_list参数是一个数组,当你不需要把某些本地变量给打印出来的,把它的名字写到这个数组就行了

小demo
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
  end
end

Kitty.new.hello

输出结果
引用
{"str"=>"hello kitty"}


思路
  • 通过binding方法获取异常发生的上下文
  • 调用上下文的eval方法,在eval里通过ruby自带的local_variables,获取所有本地变量的名称
  • 通过eval获取本地变量的值,把它存起来,返回结果


在Rails中,再配合exception_notification,用着就觉得很舒服了,追求完美话,可以把常量,自定的全局变量都打印出来
0
0
分享到:
评论
1 楼 ruby_windy 2011-10-24  
嗯,相当好的思路.
bind与context可以用在这些好的调试的技巧中:)

相关推荐

    Ruby-NestyRuby的嵌套异常

    1. **嵌套异常信息**:Nesty可以保存每个`rescue`块中发生的完整异常链,这样在处理异常时,你可以获取到完整的错误上下文。 2. **自定义异常类型**:除了标准的Ruby异常类,Nesty还允许创建自定义异常类型,这有助...

    ruby下载太慢保存下

    标题“ruby下载太慢保存下”指的是在尝试下载Ruby官方发行版时可能遇到的速度问题。这可能是由于网络状况不佳、服务器负载过高或者地理位置远离Ruby源服务器等原因导致的。为了解决这个问题,用户可以考虑以下几种...

    Ruby-GemExceptionTrack捕捉Rails应用运行期的异常并存储到数据库

    在Rails应用的生命周期中,如果发生错误或异常,ExceptionTrack会捕获这些异常,然后不是简单地让程序崩溃,而是将异常信息保存起来。存储在数据库中的异常信息便于后期分析和问题定位,提高了开发团队的效率,尤其...

    Ruby-ngxruby是嵌入ruby脚本的Nginx模块

    7. **错误处理**:在Ruby脚本中处理异常和错误是必不可少的,因为任何未捕获的异常都可能导致Nginx服务中断。使用`rescue`来捕获并处理错误。 8. **日志记录**:利用Ruby的`puts`或其他日志库记录运行时信息,有助...

    Best of Ruby Quiz

    7. **异常处理**:Ruby中的`begin..rescue..else..ensure`结构用于异常处理,书中可能会有相关问题,教你如何优雅地处理错误。 8. **Gem生态系统**:Ruby的库管理工具Gem提供了丰富的第三方库,如Nokogiri(XML处理...

    ruby trap 初学者使用

    "Ruby Trap"这个标题暗示了这是一本关于Ruby编程中常见问题和陷阱的电子书,旨在帮助初学者避免在学习过程中遇到的困扰。下面,我们将深入探讨一些可能涵盖在书中的Ruby编程知识点。 1. **变量和常量**: - Ruby有...

    Ruby-TraceLocation可以帮助您跟踪代码的源位置并帮助您阅读Ruby中庞大的开放源库

    - **调试**: 当代码中出现错误或异常时,`TraceLocation` 可以帮助快速找到出错的行号和文件,从而简化调试过程。 - **性能优化**: 通过追踪代码执行路径,可以识别出性能瓶颈,对慢速执行的代码进行优化。 - **...

    ruby.rar

    此外,Ruby的错误处理机制采用异常处理,通过`begin-rescue-end`块来捕获和处理运行时可能出现的问题。 接下来,我们来看看Ruby中的几个重要概念: 1. **块(Blocks)**:Ruby的块是代码的可重用部分,通常与迭代...

    Ruby-MiniMagickImageMagick或GraphicsMagick命令行的一个ruby封装

    通过MiniMagick,Ruby开发者能够轻松地在他们的应用程序中集成这些功能,而无需直接与命令行交互。 **MiniMagick的安装** 首先,为了使用MiniMagick,你需要确保你的系统已经安装了ImageMagick或GraphicsMagick。这...

    一个Ruby进阶示例,展示了面向对象编程、模块化、异常处理和文件操作 这个例子中,我们将创建一个简单的博客系统,其中包含文章

    要运行这个Ruby程序,你可以将上述代码保存到一个名为 blog_system.rb 的文件中,然后在命令行中使用Ruby解释器运行它: ruby blog_system.rb 这将执行程序,并在控制台中输出程序的输出。如果发生任何异常,它们将...

    ruby入门练习题.zip

    10. **错误处理**:Ruby使用`begin..rescue..end`来处理异常,可以捕获和处理程序运行时可能出现的错误。 通过"ruby入门练习题",你将有机会实践这些概念,理解如何定义和使用类,如何操作对象,以及如何利用Ruby的...

    Ruby-Wombat轻量级的RubyWeb爬虫

    4. **存储结果**:最后,你可以配置Wombat将抓取的数据保存到文件、数据库或其他持久化存储中。`store`方法可以帮助你实现这一目标,它可以与各种存储方式进行集成,如JSON、CSV、数据库等。 在“wombat-master”这...

    ruby中文文档

    5. **符号(Symbol)**:Ruby中的符号是不可变的字符串引用,它们在内存中只保存一份,常用于创建哈希键或方法名。 6. **数组(Array)和哈希(Hash)**:Ruby提供了强大的数组和哈希数据结构,支持多种操作,如...

    Ruby Sheet.pdf

    本篇文档将详细介绍Ruby速查手册中提到的关键知识点,包括预定义变量、保留字、类型、表达式、模块/类定义以及运算符和正则表达式的使用方法。 #### 预定义变量 Ruby提供了一系列预定义变量来帮助开发者在编程过程...

    ruby的pop3、SMTP类库说明

    请注意,实际应用中应考虑错误处理和异常捕获,以确保在遇到问题时能优雅地处理。此外,SMTP服务器通常要求安全连接,如使用SSL/TLS加密,因此在连接设置中可能需要指定`:tls`或`:ssl`选项。 总的来说,Ruby的POP3...

    Ruby 1.8.7-p160

    10. **异常处理**:Ruby 1.8.7支持异常处理,使用`begin..rescue..end`结构捕获和处理错误,这有助于编写健壮的代码。 总的来说,Ruby 1.8.7-p160是一个见证了Ruby早期发展的版本,它包含了许多核心概念和技术,...

    ruby语法基础教程

    §13.3.7 Ruby中YAML的使用 99 第十四章 安全控制 100 §14.1 0级 101 §14.1 1级 101 §14.2 2级 101 §14.3 3级 101 §14.4 4级 101 第十五章 单元测试 101 §15.1 什么是单元测试 101 §15.2 Ruby单元测试框架 ...

    ruby on rails 3.1.0数据库查询方法汇总

    在 Ruby on Rails 3.1.0 中,对于数据库的操作非常便捷,主要包括数据的保存、创建、查找等功能。 1. **保存数据**: - `a = Category.new(:name =&gt; 'Ruby', :position =&gt; 1)` - `a.save` - `save` 方法用于保存...

Global site tag (gtag.js) - Google Analytics