在Ruby中创建完全异常对象

在Ruby中创建完全异常对象,ruby,exception,Ruby,Exception,我想要一个异常对象的引用,该对象包含所有正常信息—消息、回溯等 异常有一个新的方法,但它不填充回溯: exception = Exception.new("my message") exception.backtrace #=> nil 文档中说有一种方法,但您必须自己提供回溯(它不只是使用当前堆栈) 我可以通过提高和拯救来解决这个问题: exception = begin raise Exception, "my message" rescue Exception => e

我想要一个异常对象的引用,该对象包含所有正常信息—消息、回溯等

异常有一个新的方法,但它不填充回溯:

exception = Exception.new("my message")
exception.backtrace
#=> nil
文档中说有一种方法,但您必须自己提供回溯(它不只是使用当前堆栈)

我可以通过提高和拯救来解决这个问题:

exception = begin
  raise Exception, "my message"
rescue Exception => e
  e
end
exception.backtrace
#=> ["(irb):4:in 'irb_binding'", ...]
但那感觉不太干净


有没有一种简单的方法可以创建一个完全填充的异常对象?

当前堆栈跟踪可以从
内核#调用者
获取,因此您可以这样做

exception = Exception.new("my message")
exception.set_backtrace(caller)

我想创建一个
异常
对象而不立即引发它基本上只有在您计划传递它时才有意义。因此,必须手动设置回溯跟踪是有意义的。

当前堆栈跟踪可以从
内核#调用者
获取,因此您可以这样做

exception = Exception.new("my message")
exception.set_backtrace(caller)

我想创建一个
异常
对象而不立即引发它基本上只有在您计划传递它时才有意义。因此,必须手动设置回溯是有意义的。

我相信您想要的是
内核#调用方_位置

def a; b; end
def b; c; end

def c
  caller_locations
end

a.each { |trace| p trace }
# => 
# "test.rb:2:in `b'"
# "test.rb:1:in `a'"
# "test.rb:8:in `<main>'"
defa;B结束
def b;C结束
def c
呼叫者位置
结束
a、 每个{|跟踪| p跟踪}
# => 
#“test.rb:2:in`b'”
#“test.rb:1:in`a'”
#“test.rb:8:in`”

Kernel#caller
的区别在于,caller传递字符串对象<代码>调用方位置提供
线程::回溯::位置
对象。我看不到任何其他差异,所以
调用方位置对我来说似乎更通用一些——拥有像
lineno
path
等可能很方便的方法。

我相信你想要的是
内核#调用方位置

def a; b; end
def b; c; end

def c
  caller_locations
end

a.each { |trace| p trace }
# => 
# "test.rb:2:in `b'"
# "test.rb:1:in `a'"
# "test.rb:8:in `<main>'"
defa;B结束
def b;C结束
def c
呼叫者位置
结束
a、 每个{|跟踪| p跟踪}
# => 
#“test.rb:2:in`b'”
#“test.rb:1:in`a'”
#“test.rb:8:in`”

Kernel#caller
的区别在于,caller传递字符串对象<代码>调用方位置
提供
线程::回溯::位置
对象。我看不到任何其他差异,因此
调用方位置对我来说似乎更通用一些--有
lineno
path
,这样的方法,请注意,
caller\u locations
包含类型为
Thread::Backtrace::Location
的对象,而
caller
只返回一个
String
数组。除此之外,它们包含相同的位置。@p11y-heh,我只是看了一下,更新了我的答案,没有注意到你的回答。但是是的,你当然是对的:)顺便说一句,这不是批评,只是注意到:)
caller\u位置实际上在大多数情况下都会派上用场!我知道,你说得对,这是很好的补充信息!一些很好的信息,但不幸的是
set\u backtrace
无法接受
Thread::backtrace::Location
对象数组。它必须是一个字符串数组。请注意,
caller\u locations
包含类型为
Thread::Backtrace::Location
的对象,而
caller
只返回一个
String
数组。除此之外,它们包含相同的位置。@p11y-heh,我只是看了一下,更新了我的答案,没有注意到你的回答。但是是的,你当然是对的:)顺便说一句,这不是批评,只是注意到:)
caller\u位置实际上在大多数情况下都会派上用场!我知道,你说得对,这是很好的补充信息!一些很好的信息,但不幸的是
set\u backtrace
无法接受
Thread::backtrace::Location
对象数组。它必须是一个字符串数组。这就是我要找的。非常感谢。这将是一个很好的一行,但我认为你是正确的-它确实更有意义,这是我一直在寻找的。非常感谢。这将是一个很好的一行,但我认为你是对的-它确实更有意义,这样做。