如果传递给initialize方法的某些参数与某些条件不匹配,是否可以防止对象被初始化并引发错误?
例如,如果我定义一个具有一个属性EvenInt
且必须是偶数整数的类x
,是否可以阻止此类的对象被初始化,例如,如果我将3
作为参数传递?
如果是这样,你能否快速解释如何这样做,尤其是如何引发错误?
答案 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
表示您可以指定的特定错误类型。然后你向用户留言,说明这是错误的。