覆盖StandardError子类的初始化

时间:2015-12-11 00:11:57

标签: ruby exception-handling

我想在StandardError子类中保留对象的引用。

我的第一直觉是覆盖initialize并指定它(提供attr_reader),因此:

  class UnprocessableCardError < StandardError
    attr_reader :card

    def initialize(msg, card = nil)
      @card = card
      super msg
    end
  end

不幸的是,当我使用backtrace must be Array of String时会产生fail,因此:

fail UnprocessableCardError, "Message", card_obj

2 个答案:

答案 0 :(得分:0)

我目前不太满意的解决方法是:

  class UnprocessableCardError < StandardError
    attr_reader :card

    def self.with_card(card, msg)
      new(msg).tap do |error|
        error.instance_variable_set :@card, card
      end
    end
  end

必须这样称呼:

fail UnprocessableCardError.with_card card, 'some reason'

答案 1 :(得分:0)

我猜你正在尝试这样做:

fail UnprocessableCardError, "Message", card_obj

问题在于你将三个参数传递给failfail期望第三个参数(如果存在)是回溯,它应该是一个字符串数组

你仍然可以使用你的异常类,如下所示:

fail UnprocessableCardError.new("Message", card_obj)

这可以按预期工作:

begin
  fail UnprocessableCardError.new("Message", 12345)
rescue UnprocessableCardError => ex
  puts ex.card
end
# => 12345