首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby Rescue显示完整的回溯

Ruby Rescue显示完整的回溯
EN

Stack Overflow用户
提问于 2009-09-23 15:01:06
回答 2查看 20.5K关注 0票数 22

这里有一个非常快速的例子:

代码语言:javascript
复制
puts File.join(nil, "hello")

将输出

代码语言:javascript
复制
test.rb:4:in 'join': can't convert nil into String (TypeError)
from test.rb:4

但是当我这样做的时候:

代码语言:javascript
复制
begin
  puts File.join(nil, "hello")
rescue => exception
  puts exception.backtrace
end

这将输出

代码语言:javascript
复制
test.rb:4:in 'join'
test.rb:4

现在如何捕获完整的回溯,包括"can't convert nil into String (TypeError)“部分?

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

代码语言:javascript
复制
puts "=============================="
puts error.message
puts "=============================="
puts error.inspect
puts "=============================="
puts error.backtrace
puts "=============================="

返回

代码语言:javascript
复制
==============================
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
==============================
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-23 15:09:13

根据对#inspect的调用,值存储在那里的某个位置:

代码语言:javascript
复制
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

Exception#message是描述性的部分:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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
票数 28
EN

Stack Overflow用户

发布于 2016-09-14 17:31:34

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

对于我们这些脚本编写人员来说,ruby提供了两个方便的全局变量(我认为是线程全局变量),$!$@,它们分别指向最后一个异常和最后一个异常回溯。

代码语言:javascript
复制
begin
  puts File.join(nil, "Hello")
rescue
  puts $! # ("no implicit ....")
  puts $@ # backtrace
end

将输出:

代码语言:javascript
复制
no implicit conversion of nil into String
/tmp/e.rb:2:in `join'
/tmp/e.rb:2:in `<main>'

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

Ruby stdlib包含'English'模块(是的,大写),您可以使用它

代码语言:javascript
复制
require "English" # capital-E!
# ...
  puts $ERROR_INFO     # $! ("no implicit ....")
  puts $ERROR_POSITION # $@ backtrace
# ...

这很奇怪,我从来没有用过它--但也许有人对此很满意。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1466577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档