如何使用backtrace创建例外?
我知道我们可以做这样的事情来实现这个目标:
begin
raise StandardError, "message"
rescue StandardError => exception
exception.backtrace
end
或者
exception = StandardError.new("message")
exception.set_backtrace(caller)
但我正在寻找这样的事情:
exception = StandardError.new("message", backtrace: caller)
有没有办法可以使用自定义消息和回溯来初始化异常?
提前致谢!!!
答案 0 :(得分:13)
您无法使用回溯初始化异常,但您可以在初始化后立即指定一个异常。
exception = StandardError.new("message")
exception.set_backtrace(caller)
答案 1 :(得分:2)
自己包装一个功能课:
class ErrorCreator
def self.new(error, message = nil, backtrace: caller)
exception = error.new(message)
exception.set_backtrace(backtrace)
exception
end
end
使用:
ErrorCreator.new(StandardError, "failed")
ErrorCreator.new(StandardError, "failed", backtrace: caller)
答案 2 :(得分:1)
您可以像这样创建自己的例外:
在app > exceptions > name_exception.rb
name_exception.rb
class NameException < StandardError
def initialize(message, backtrace)
super
backtrace
end
end
然后在你的文件中
raise NameException.new(message, backtrace)
你可以根据自己的需要调整它,但模式就在这里。
答案 3 :(得分:0)
与其他答案一样,您需要在错误对象上使用set_backtrace
。但是你可以在自定义错误的初始化方法中这样做:
class MyError < StandardError
def initialize(message, backtrace)
super(message)
set_backtrace backtrace
end
end
通过这种方式,您可以将所有逻辑封装在一个类中,而无需出现错误工厂。