Ruby Rescue显示完整的Backtrace

Rya*_*wis 19 ruby

这是一个真实的快速示例:

puts File.join(nil, "hello")
Run Code Online (Sandbox Code Playgroud)

会输出

test.rb:4:in 'join': can't convert nil into String (TypeError)
from test.rb:4
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时:

begin
  puts File.join(nil, "hello")
rescue => exception
  puts exception.backtrace
end
Run Code Online (Sandbox Code Playgroud)

这将输出

test.rb:4:in 'join'
test.rb:4
Run Code Online (Sandbox Code Playgroud)

现在我如何捕获完整的回溯,包括"无法将nil转换为String(TypeError)"部分?

@Sarah Vessels: 在我的特定代码中,这段代码:

puts "=============================="
puts error.message
puts "=============================="
puts error.inspect
puts "=============================="
puts error.backtrace
puts "=============================="
Run Code Online (Sandbox Code Playgroud)

回报

==============================
exit
==============================
#<SystemExit: exit>
==============================
/usr/lib/ruby/1.8/glib2.rb:37:in `exit'
/usr/lib/ruby/1.8/glib2.rb:37:in `exit_application'
multi.rb:234:in `main'
multi.rb:347
==============================
Run Code Online (Sandbox Code Playgroud)

Sar*_*els 24

根据对#inspect的调用,该值存储在某处:

irb(main):001:0> begin
irb(main):002:1* puts File.join(nil, "Hello")
irb(main):003:1> rescue => exception
irb(main):004:1> puts exception.inspect
irb(main):005:1> end
#<TypeError: can't convert nil into String>
=> nil
Run Code Online (Sandbox Code Playgroud)

异常#消息是描述性部分:

irb(main):006:0> begin
irb(main):007:1* puts File.join(nil, "hello")
irb(main):008:1> rescue => ex
irb(main):009:1> puts ex.message
irb(main):010:1> end
can't convert nil into String
=> nil
Run Code Online (Sandbox Code Playgroud)

因此,要获得您正在寻找的数据类型,您可以执行以下操作:

irb(main):015:0> begin
irb(main):016:1* puts File.join(nil, "hey")
irb(main):017:1> rescue => ex
irb(main):018:1> puts "#{ex.backtrace}: #{ex.message} (#{ex.class})"
irb(main):019:1> end
(irb):16:in `join'(irb):16:in `irb_binding'C:/Ruby/lib/ruby/1.8/irb/workspace.rb
:52:in `irb_binding':0: can't convert nil into String (TypeError)
=> nil
Run Code Online (Sandbox Code Playgroud)


Fel*_*lix 6

@SaraVessels 的答案更接近您想要的,但我认为现成的替代方案也可能对其他人有所帮助。

对于我们的scripties,红宝石带有两个方便的全局(当然,线程全局我认为),$!以及$@其指向的最后一个异常和最后例外回溯。

begin
  puts File.join(nil, "Hello")
rescue
  puts $! # ("no implicit ....")
  puts $@ # backtrace
end
Run Code Online (Sandbox Code Playgroud)

将输出:

no implicit conversion of nil into String
/tmp/e.rb:2:in `join'
/tmp/e.rb:2:in `<main>'
Run Code Online (Sandbox Code Playgroud)

这不是很明确,但在交互式或非常原型的设置中很方便。

Ruby stdlib 包含“英语”模块(是的,大写),您可以使用它

require "English" # capital-E!
# ...
  puts $ERROR_INFO     # $! ("no implicit ....")
  puts $ERROR_POSITION # $@ backtrace
# ...
Run Code Online (Sandbox Code Playgroud)

它很奇怪,我从未使用过它 - 但也许有人对此感到高兴(y | ier)。