在Ruby中创建完整的Exception对象

1 ruby exception

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

异常有一个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对象?

Pat*_*ity 5

可以从中获取当前堆栈跟踪Kernel#caller,因此您可以这样做

exception = Exception.new("my message")
exception.set_backtrace(caller)
Run Code Online (Sandbox Code Playgroud)

我想创建一个Exception对象而不立即提升它基本上只有在你计划传递它时才有意义.因此,必须手动设置回溯是有意义的.