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

如何让ruby打印完整的回溯而不是截断的?

如何解决《如何让ruby打印完整的回溯而不是截断的?》经验,为你挑选了6个好方法。

当我得到异常时,它通常来自调用堆栈中的深层.当发生这种情况时,通常会对我隐藏实际有问题的代码行:

tmp.rb:7:in `t': undefined method `bar' for nil:NilClass (NoMethodError)
        from tmp.rb:10:in `s'
        from tmp.rb:13:in `r'
        from tmp.rb:16:in `q'
        from tmp.rb:19:in `p'
        from tmp.rb:22:in `o'
        from tmp.rb:25:in `n'
        from tmp.rb:28:in `m'
        from tmp.rb:31:in `l'
         ... 8 levels...
        from tmp.rb:58:in `c'
        from tmp.rb:61:in `b'
        from tmp.rb:64:in `a'
        from tmp.rb:67

那个"... 8级......"截断给我带来了很多麻烦.我在这方面没有太大的成功:我怎么告诉ruby我想要转储包含完整的堆栈?



1> Gareth..:

异常#backtrace包含整个堆栈:

def do_division_by_zero; 5 / 0; end
begin
  do_division_by_zero
rescue => exception
  puts exception.backtrace
  raise # always reraise
end

(灵感来自Peter Cooper的Ruby Inside博客)


我会重新启动异常,至少为了示例completness.
要重新加注你只需要说"加注".无需明确指定要引发的execption.

2> anonymous co..:

如果你想要一个简单的单行程,你也可以这样做:

puts caller


不需要提升/救援,你可以使用Kernel#caller,就像这样:`puts'这行是#{caller.join("\n")}"`
太棒了.非常感谢.我不知道`raise`可以在没有参数的情况下使用.我都不知道`救援'会被正确地当作一个班轮.我也完全忽略了像`$!`这样的全球变量.

3> 小智..:

这会产生错误描述和漂亮的干净,缩进的堆栈跟踪:

begin               
 # Some exception throwing code
rescue => e
  puts "Error during processing: #{$!}"
  puts "Backtrace:\n\t#{e.backtrace.join("\n\t")}"
end



4> 小智..:

IRB设置了这个可怕的"功能",您可以自定义.

创建一个名为~/.irbrc包含以下行的文件:

IRB.conf[:BACK_TRACE_LIMIT] = 100

这将允许您irb至少看到100个堆栈帧.我无法找到非交互式运行时的等效设置.

有关IRB定制的详细信息可以在Pickaxe书中找到.


这应该是公认的答案,因为它解决了如何显示更多的回溯而不是"...... X级......"的问题.

5> Dorian..:

一个用于callstack的班轮:

begin; Whatever.you.want; rescue => e; puts e.message; puts; puts e.backtrace; end

没有所有宝石的一个用于callstack的班轮:

begin; Whatever.you.want; rescue => e; puts e.message; puts; puts e.backtrace.grep_v(/\/gems\//); end

一个没有所有宝石和相对于当前目录的callstack的衬垫

begin; Whatever.you.want; rescue => e; puts e.message; puts; puts e.backtrace.grep_v(/\/gems\//).map { |l| l.gsub(`pwd`.strip + '/', '') }; end


@nurettin这是为了快速调试目的,所以使它成为一行可以很容易地复制粘贴它,主要是在交互式shell中

6> android.weas..:

如果这对你很重要,那就模仿官方的Ruby跟踪.

begin
  0/0  # or some other nonsense
rescue => e
  puts e.backtrace.join("\n\t")
       .sub("\n\t", ": #{e}#{e.class ? " (#{e.class})" : ''}\n\t")
end

有趣的是,它没有正确处理'未处理的异常',将其报告为'RuntimeError',但位置是正确的.

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