考虑下面的Ruby 代码

测验rb:

begin

  puts
  thisFunctionDoesNotExist
  x = 1+1
rescue Exception => e
  p e
end

出于调试目的,我希望rescue块知道错误发生在该文件的第4行.有没有干净的方法?

推荐答案

p e.backtrace 

我在一次IRB会议上运行了它,但没有来源,它仍然提供了相关信息.

=> ["(irb):11:in `foo'", 
    "(irb):17:in `irb_binding'", 
     "/usr/lib64/ruby/1.8/irb/workspace.rb:52:in `irb_binding'", 
     "/usr/lib64/ruby/1.8/irb/workspace.rb:52"]

如果您想要一个解析良好的回溯,下面的正则表达式可能会很方便:

p x.backtrace.map{ |x|   
     x.match(/^(.+?):(\d+)(|:in `(.+)')$/); 
    [$1,$2,$4] 
}

[
  ["(irb)", "11", "foo"], 
  ["(irb)", "48", "irb_binding"], 
  ["/usr/lib64/ruby/1.8/irb/workspace.rb", "52", "irb_binding"], 
  ["/usr/lib64/ruby/1.8/irb/workspace.rb", "52", nil]
]

(Regex/should/对函数名或目录/文件名中的奇怪字符是安全的)

>>def foo
>>  thisFunctionDoesNotExist
>> rescue Exception => e 
>>   return e 
>>end     
>>x = foo 
>>x.backtrace

Ruby相关问答推荐

Ruby中链表大小调用的时间复杂度

Ruby 中的 Float#floor 和 Float#to_i 有什么区别?

为什么 ruby​​ 获得证书信任链与 gnutls-cli 不同

如何使用 HEREDOC 作为参数传递给方法?

查看 Savon 请求 XML 而不发送到服务器

ActiveRecord::AdapterNotSpecified 数据库配置未指定适配器

从 ruby​​ 脚本运行另一个 ruby​​ 脚本

数组到哈希:字数

在 Ruby 中,获取第一个块返回 true 的可枚举元素的最快方法是什么?

ruby 是否支持 case 语句中的范围?

如果尚未定义,则设置 Ruby 变量

卸载所有 gem Ruby 2.0.0

读取文件时如何避免 UTF-8 BOM

Ruby:module、require和include

如何在 ruby​​ rake 中明确地失败任务?

从 Ruby 中的字符串创建不区分大小写的正则表达式

如何在 Ruby 的 IRB 中启用自动完成

如何计算Ruby日期的星期几?

如何使用 Ruby 的 self 关键字

如何判断一个类是否已定义?