【发布时间】:2014-01-12 23:27:54
【问题描述】:
当我调用Exception#backtrace_locations 时,它通常会按预期返回一个数组:
begin
raise "foo"
rescue => e
p e.backtrace_locations
end
# => ["this_file:2:in `<main>'"]
如果我手动提出 ArgumentError 也是一样的:
begin
raise ArgumentError.new
rescue => e
p e.backtrace_locations
end
# => ["this_file:2:in `<main>'"]
但是,当我通过调用具有错误数量的参数的方法来引发真正的ArgumentError 时,backtrace_locations 是nil,这出乎我的意料:
def foo; end
begin
foo(:bar)
rescue => e
p e.backtrace_locations
end
# => nil
同样的情况下,经典的Exception#backtrace按原意返回一个数组:
def foo; end
begin
foo(:bar)
rescue => e
p e.backtrace
end
# => ["this_file:1:in `foo'", "this_file:4:in `<main>'"]
在上述第三种情况下Exception#backtrace_locations 的返回值是否为nil?如果是这样,Exception#backtrace_locations 什么时候变成nil?有这方面的文件吗?或者,它是一个 Ruby 错误?
在这一点上,我认为这是一个错误,reported it。
【问题讨论】:
-
看起来(如果是同一个问题)它还没有在 2.1 中:bugs.ruby-lang.org/issues/8960
-
@CDub 你是什么意思它还没有?修订版 44170 应该已经实现了它。该方法返回
nil;它被定义。如果它没有被定义,那么它应该引发一个未定义的错误。 -
根据 12 天前在上述线程中的最后一条评论:“目标版本从当前版本更改:2.1.0 到下一个次要版本”......我读到“它将在下一个次要版本中,它不在 2.1.0 中。”
-
或者我发现了错误的问题...我愿意犯错。我今天已经至少错了 131241 次。 :)
-
@CDub 感谢 cmets。我对 ko1 对该线程的最后评论的解释是,他已经完成了
backtrace_locations,但还没有完成set_backtrace_locations之类的。从这个意义上说,它已经完成了一半,并已设置为下一个小调。