在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
对象数组。它必须是一个字符串数组。这就是我要找的。非常感谢。这将是一个很好的一行,但我认为你是正确的-它确实更有意义,这是我一直在寻找的。非常感谢。这将是一个很好的一行,但我认为你是对的-它确实更有意义,这样做。