当前位置:  开发笔记 > 后端 > 正文

捕获ruby异常中的行号

如何解决《捕获ruby异常中的行号》经验,为你挑选了4个好方法。

请考虑以下ruby代码

test.rb:

begin

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

出于调试目的,我希望救援块知道该文件的第4行发生了错误.这样做有干净的方法吗?



1> Kent Fredric..:
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]
]

(正则表达式/应该/可以安全地防止函数名称或目录/文件名中的奇怪字符)(如果你想知道foo来自哪里,我做了一个def来抓取异常:

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



2> dan-manges..:

您可以从Exception对象访问回溯.要查看整个回溯:

p e.backtrace

它将包含调用堆栈的文件和行号数组.对于像你问题中那样的简单脚本,它只包含一行.

["/Users/dan/Desktop/x.rb:4"]

如果需要行号,可以检查回溯的第一行,并在冒号后提取值.

p e.backtrace[0].split(":").last


.last获取方法名称。行号是之前的一个元素。

3> Serge Selets..:

通常,回溯包含来自外部宝石的许多行.仅查看与项目本身相关的行更方便

我的建议是按项目文件夹名称过滤回溯

puts e.backtrace.select { |x| x.match(/HERE-IS-YOUR-PROJECT-FOLDER-NAME/) }

然后,您可以解析过滤后的行,以提取其他答案中建议的行号.



4> John Bachir..:

在这个旧线程上投入0.02美元 - 这是一个维护所有原始数据的简单解决方案:

print e.backtrace.join("\n")

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有