如果方法的参数不符合某些条件,则引发错误

时间:2018-06-05 14:59:35

标签: ruby

如果传递给initialize方法的某些参数与某些条件不匹配,是否可以防止对象被初始化并引发错误?

例如,如果我定义一个具有一个属性EvenInt且必须是偶数整数的类x,是否可以阻止此类的对象被初始化,例如,如果我将3作为参数传递?

如果是这样,你能否快速解释如何这样做,尤其是如何引发错误?

4 个答案:

答案 0 :(得分:2)

基本上,您需要检查提供的参数是否符合条件,如果是,则执行任何方法应该执行的操作,否则引发异常:

class EventInt
  def initialize(x)
    if x.is_a?(Integer) && x.even?
      @x = x
    else
      raise 'Argument should be an even integer'
    end
  end
end

EventInt.new(1)
#=> RuntimeError: Argument should be an even integer
EventInt.new(1.1)
#=> RuntimeError: Argument should be an even integer
EventInt.new(1.2)
#=> RuntimeError: Argument should be an even integer
EventInt.new(2)
#=> #<A:0x00007fca4c9a0498 @even_int=2>

实际上,返回特定错误更有意义,即ArgumentError

raise ArgumentError, 'Argument should be an even integer'

或者,如果您想拥有自定义错误类,则可以执行以下操作:

NotEvenIntegerArgumentError = Class.new(ArgumentError)

然后在initialize

raise NotEvenIntegerArgumentError, 'Argument should be an even integer'

或者,如果需要,可以在异常类中设置默认的异常消息。整个代码如下所示

class EventInt
  NotEvenIntegerArgumentError = Class.new(ArgumentError) do
    def message
      'Argument should be an even integer'
    end
  end

  def initialize(x)
    if x.is_a?(Integer) && x.even?
      @x = x
    else
      raise NotEvenIntegerArgumentError
    end
  end
end

答案 1 :(得分:1)

是的,是科西嘉。像这样的东西

class EvenInteger
  def initialize(number)
    if number.odd?
      raise StandardError
    end
    @value = number
  end

  attr_reader :value
end

EvenInteger.new(3)
=> StandardError (StandardError)
EvenInteger.new(4).value
=> 4

或许您可以提出ArgumentError甚至定义StandardError的特定子类。

答案 2 :(得分:0)

当然,只是在initialize方法中引发错误:

class EnventInt
  def initialize(x)
    @x = x

    raise ArgumentError, "x must be even" unless @x.even?
  end
end

答案 3 :(得分:-1)

您可以使用Ruby的raise方法来引发错误,此外,您还可以编写一条消息来告诉用户发生这种情况的原因。

class EvenInt
  attr_reader :x
  def initialize(integer)
    raise ArgumentError, "Number shoud be even." unless integer.even?
    @x = integer
  end
end

如果您尝试:

> EvenInt.new(2)
=> #<EvenInt:0x00007fbc81019830 @x=2>

> EvenInt.new(3)
Traceback ......
......
ArgumentError (Number shoud be even.)

ArgumentError表示您可以指定的特定错误类型。然后你向用户留言,说明这是错误的。