在rubyexception中捕捉行号
考虑下面的ruby代码
test.rb:
begin puts thisFunctionDoesNotExist x = 1+1 rescue Exception => e pe end
为了debugging的目的,我希望救援块知道错误发生在这个文件的第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"]
如果你想要一个很好的parsing回溯,下面的正则expression式可能会很方便:
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] ]
(正则expression式/应该/在函数名称或目录/文件名怪异字符安全)(如果你想知道从哪里来,我做了一个def来抓取exception:
>>def foo >> thisFunctionDoesNotExist >> rescue Exception => e >> return e >>end >>x = foo >>x.backtrace
您可以从Exception对象访问回溯。 要查看整个回溯:
p e.backtrace
它将包含调用堆栈的一系列文件和行号。 对于一个简单的脚本,就像你的问题,它只包含一行。
["/Users/dan/Desktop/x.rb:4"]
如果您想要行号,您可以检查回溯的第一行,并提取冒号后面的值。
p e.backtrace[0].split(":").last
在这个旧线程中抛出0.02美元 – 这是一个简单的解决scheme,保留所有的原始数据:
print e.backtrace.join("\n")
通常情况下,回溯包含很多来自外部gem的线条。仅查看与项目本身相关的线条会更加方便
我的build议是通过项目文件夹名称筛选回溯
puts e.backtrace.select { |x| x.match(/HERE-IS-YOUR-PROJECT-FOLDER-NAME/) }
然后你可以parsing过滤的行来提取行号,如其他答案中的build议。
在Ruby 1.9.3中,你可以以更加结构化,可靠和简单的方式访问这些信息,而不用使用正则expression式来剪切string。
其基本思想是引入一个调用框架对象,该对象可以访问有关调用堆栈的信息。
请参阅http://wiki.github.com/rocky/rb-threadframe/ ,唉,需要修补Ruby 1.9。 在RubyKaigi 2010(2010年8月下旬),一个会议计划讨论在Ruby中引入一个框架对象。
鉴于此,最早可能发生在Ruby 1.9.3中。
- 如何解决java.net.SocketException:损坏的pipe道?
- C#中的exception有多昂贵?
- 如何让ruby打印一个完整的回溯,而不是一个截断的?
- UnobservedTaskException被抛出,但它由TaskScheduler.UnobservedTaskException处理程序和一个continuation OnlyOnFaulted处理程序处理
- 为什么编译器检查C ++中的exception?
- 在ruby中捕获Ctrl-C
- 最后不会在.net中执行的条件try..finally block
- C ++ catch块 – 通过值或引用捕获exception?
- debugging器不会在asynchronous方法中打破/停止exception