我想要一个包含所有正常信息的异常对象的引用 - 消息,回溯等.
异常有一个new
方法,但它不会填充回溯:
exception = Exception.new("my message")
exception.backtrace
#=> nil
Run Code Online (Sandbox Code Playgroud)
文档说有一个set_backtrace方法,但你必须自己提供回溯(它不只是使用当前的堆栈).
我可以通过提高和救援来解决这个问题:
exception = begin
raise Exception, "my message"
rescue Exception => e
e
end
exception.backtrace
#=> ["(irb):4:in 'irb_binding'", ...]
Run Code Online (Sandbox Code Playgroud)
但那感觉不是很干净.
有没有一种简单的方法来创建一个完全填充的Exception对象?
可以从中获取当前堆栈跟踪Kernel#caller
,因此您可以这样做
exception = Exception.new("my message")
exception.set_backtrace(caller)
Run Code Online (Sandbox Code Playgroud)
我想创建一个Exception
对象而不立即提升它基本上只有在你计划传递它时才有意义.因此,必须手动设置回溯是有意义的.