如何使用消息和回溯手动创建异常

时间:2016-05-10 09:57:13

标签: ruby exception

如何使用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)

有没有办法可以使用自定义消息和回溯来初始化异常?

提前致谢!!!

4 个答案:

答案 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)

我为任何人创建了一个宝石:example

答案 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

通过这种方式,您可以将所有逻辑封装在一个类中,而无需出现错误工厂。