无法接触到服务器,但有些问题需要异常的数据,虽然可以在抛出异常时把数据给手动打印到日记,感觉太麻烦了
记得有看豆瓣的架构时,有提到他们在发生异常时,会把当时的所有变量都打印到日记里,方便调试.
在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,用着就觉得很舒服了,追求完美话,可以把常量,自定的全局变量都打印出来
分享到:
相关推荐
1. **嵌套异常信息**:Nesty可以保存每个`rescue`块中发生的完整异常链,这样在处理异常时,你可以获取到完整的错误上下文。 2. **自定义异常类型**:除了标准的Ruby异常类,Nesty还允许创建自定义异常类型,这有助...
标题“ruby下载太慢保存下”指的是在尝试下载Ruby官方发行版时可能遇到的速度问题。这可能是由于网络状况不佳、服务器负载过高或者地理位置远离Ruby源服务器等原因导致的。为了解决这个问题,用户可以考虑以下几种...
在Rails应用的生命周期中,如果发生错误或异常,ExceptionTrack会捕获这些异常,然后不是简单地让程序崩溃,而是将异常信息保存起来。存储在数据库中的异常信息便于后期分析和问题定位,提高了开发团队的效率,尤其...
7. **错误处理**:在Ruby脚本中处理异常和错误是必不可少的,因为任何未捕获的异常都可能导致Nginx服务中断。使用`rescue`来捕获并处理错误。 8. **日志记录**:利用Ruby的`puts`或其他日志库记录运行时信息,有助...
7. **异常处理**:Ruby中的`begin..rescue..else..ensure`结构用于异常处理,书中可能会有相关问题,教你如何优雅地处理错误。 8. **Gem生态系统**:Ruby的库管理工具Gem提供了丰富的第三方库,如Nokogiri(XML处理...
"Ruby Trap"这个标题暗示了这是一本关于Ruby编程中常见问题和陷阱的电子书,旨在帮助初学者避免在学习过程中遇到的困扰。下面,我们将深入探讨一些可能涵盖在书中的Ruby编程知识点。 1. **变量和常量**: - Ruby有...
- **调试**: 当代码中出现错误或异常时,`TraceLocation` 可以帮助快速找到出错的行号和文件,从而简化调试过程。 - **性能优化**: 通过追踪代码执行路径,可以识别出性能瓶颈,对慢速执行的代码进行优化。 - **...
此外,Ruby的错误处理机制采用异常处理,通过`begin-rescue-end`块来捕获和处理运行时可能出现的问题。 接下来,我们来看看Ruby中的几个重要概念: 1. **块(Blocks)**:Ruby的块是代码的可重用部分,通常与迭代...
通过MiniMagick,Ruby开发者能够轻松地在他们的应用程序中集成这些功能,而无需直接与命令行交互。 **MiniMagick的安装** 首先,为了使用MiniMagick,你需要确保你的系统已经安装了ImageMagick或GraphicsMagick。这...
要运行这个Ruby程序,你可以将上述代码保存到一个名为 blog_system.rb 的文件中,然后在命令行中使用Ruby解释器运行它: ruby blog_system.rb 这将执行程序,并在控制台中输出程序的输出。如果发生任何异常,它们将...
10. **错误处理**:Ruby使用`begin..rescue..end`来处理异常,可以捕获和处理程序运行时可能出现的错误。 通过"ruby入门练习题",你将有机会实践这些概念,理解如何定义和使用类,如何操作对象,以及如何利用Ruby的...
4. **存储结果**:最后,你可以配置Wombat将抓取的数据保存到文件、数据库或其他持久化存储中。`store`方法可以帮助你实现这一目标,它可以与各种存储方式进行集成,如JSON、CSV、数据库等。 在“wombat-master”这...
5. **符号(Symbol)**:Ruby中的符号是不可变的字符串引用,它们在内存中只保存一份,常用于创建哈希键或方法名。 6. **数组(Array)和哈希(Hash)**:Ruby提供了强大的数组和哈希数据结构,支持多种操作,如...
本篇文档将详细介绍Ruby速查手册中提到的关键知识点,包括预定义变量、保留字、类型、表达式、模块/类定义以及运算符和正则表达式的使用方法。 #### 预定义变量 Ruby提供了一系列预定义变量来帮助开发者在编程过程...
请注意,实际应用中应考虑错误处理和异常捕获,以确保在遇到问题时能优雅地处理。此外,SMTP服务器通常要求安全连接,如使用SSL/TLS加密,因此在连接设置中可能需要指定`:tls`或`:ssl`选项。 总的来说,Ruby的POP3...
10. **异常处理**:Ruby 1.8.7支持异常处理,使用`begin..rescue..end`结构捕获和处理错误,这有助于编写健壮的代码。 总的来说,Ruby 1.8.7-p160是一个见证了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 中,对于数据库的操作非常便捷,主要包括数据的保存、创建、查找等功能。 1. **保存数据**: - `a = Category.new(:name => 'Ruby', :position => 1)` - `a.save` - `save` 方法用于保存...