无法接触到服务器,但有些问题需要异常的数据,虽然可以在抛出异常时把数据给手动打印到日记,感觉太麻烦了
记得有看豆瓣的架构时,有提到他们在发生异常时,会把当时的所有变量都打印到日记里,方便调试.
在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,用着就觉得很舒服了,追求完美话,可以把常量,自定的全局变量都打印出来
分享到:
相关推荐
§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单元测试框架 ...
异常处理程序使您可以通过ActiveRecord或HTTP POST将错误消息中的关键信息保存在某个地方的数据库中,并在应用程序布局文件中向用户显示自定义的错误消息。 您可以将此异常处理程序挂接到所有Rails应用程序中,并将...
使用标准器轻松打包,管理和更新工作流程中的Ruby宝石。 友好的异常和调试输出到Mac OS X控制台。 自动保存和加载缓存的反馈 发生问题时,将救援反馈项目自动显示为“ alfred”。 轻松加载和保存用户配置的功能...
Ruby示例基础编程此回购保存了描述现代原理,模式的示例。网络文档:翻译:内容: RubyRuby的异常行为-几个小时的核心调试中我们看不到一个小细节。 ( 元编程元编程是指计算机程序的编写,这些计算机程序将其他程序...
由ruby编写,需要ruby环境,插件很多 3. 配置简单,偏重数据前期处理,分析方便 从两者的设计思想来看,Flume 最初并不是为了采集日志而设计,而是定位在把数据传入 HDFS 中,这和 Logstash 有根本的区别。所以它...
即使稍微无效的 XML 也可能立即导致异常。 安装 宝石安装'sax_stream' 用法 定义映射器类 这些是您希望从 XML 中提取的对象定义。 我建议为这些坚持使用相当精简的类。 过去,我使用过类似 ROXML 的库,并从 Acti
自述文件 这是一个用于演示目的的简单 Web 服务。 它是公司信息数据库的接口,由 REST API 和客户端两部分组成。 API 的用法在讨论。... 保存数据时带有感叹号的方法,以确保在出现问题时引发异常。 所有异
Milia允许将所有租户的数据保存在同一数据库中,并强制执行基于行的租户数据分离。 Milia使用进行用户身份验证和注册。ilia莉娅亮点对主应用程序代码透明具有用户认证的共生(支持开箱即用的) 尝试非法访问时引发...
这个怎么运作向其提供ActiveRecord对象或ActiveRelation对象的数组,它将使您能够: 将数据提取到.yml固定装置将其加载到数据库或内存中从保存的ActiveRelation提取查询中重建.yml灯具。用法提取夹具组(通常在irb...
Ruby 预处理脚本 为模式识别项目而开发。 它们的目的是从文件中读取数据,并为进行机器培训做好准备。 其中最著名的是csv_reader.rb。 csv_reader.rb集成了一组预处理技术,这些预处理技术将以时间序列格式应用于...
表情符号当尝试保存包含表情符号等的文本行时,配置了 utf-8 编码的 MySQL 会崩溃,为了解决这个问题,Demoji 从该特定异常中拯救出来,并用空格替换了罪魁祸首字符。 在 Rails 在迁移、模式等中添加对 UTF8MB4 的...
异常猎人 Exception Hunter是一个Rails引擎,旨在跟踪您的Rails项目中的错误。 它通过使用Postgres数据库来保存错误及其相应的元数据(例如发生故障时的回溯或环境数据)来工作。 为此,我们会挂接到您应用程序的...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节...保存、如何从文件中得到公钥编码的字节数组、如何从字节数组解码公钥...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节...保存、如何从文件中得到公钥编码的字节数组、如何从字节数组解码公钥...