2017-02-24 110 views
0

给出一个类:红宝石引发ArgumentError诱捕

class Foo 
    def initialize(input1) 
    @input1 = input1 
    end 
end 

是有一些方法,将抛出一个更实用的错误对a = Foo.new()?我如何构建一种以更有用的方式抛出ArgumentError的方法?

我想将它建成课堂。 Programming Ruby site列出了几种错误捕获机制,但是所有这些似乎取决于在catch块等中包装a = Foo.new()。然而,我想让我的错误陷入课堂本身。

+0

什么是“更有帮助的错误”?你的问题含糊不清。 – sawa

回答

1

你可以使用默认值,并提高你需要的初始化方法中的任何错误,例如

Class A 
    def initialize(a = nil) 
    raise("give me an A") if a.nil? 
    @a = a 
    end 
end 
0

你可以简单地通过在参数未定义时引发错误来做到这一点。您可以通过将其指定为例外的参数添加一条消息给ArgumentError例外:

class Foo 
    def initialize(input1=nil) 
    raise ArgumentError, "expected a value for Foo.new('value')" unless input1 
    @input1 = input1 
    end 
end 
+0

初始化之前不是在ArgumentError之前引发的默认ArgumentError? –

+0

好点。将参数默认为nil,然后在初始化块内引发参数错误。我更新了答案。 – mysmallidea

0

阅读Programming Ruby多一点之后,我想用alias_method作为一个钩可能有助于:

alias_method :initialize_orig, :initialize 
def initialize(*args) 
    begin 
    result = initialize_orig(*args) 
    return result 
    rescue Exception 
    $stderr.print "Need to use argument 'input1'\n" 
    raise 
    end 
end 
2

既然你ñ对于Ruby来说这是可以理解的,这个错误看起来可能很奇怪,但它也是一个错误,它非常具体地传递了错误的参数。将它重新映射到别的东西并不一定有帮助,它最终会隐藏代码中的问题。如果你没有正确地调用它,我建议将它保持原样,并期望发生类似的错误。

另一种方法是,至少在Ruby中的较新版本,没有默认声明关键字参数:

def initialize(input1:) 
end 

这是一个必需的关键字参数,且误差更具体:

ArgumentError: missing keyword: input1

缺点是你必须这样称呼它:

Foo.new(input1: 'test') 

那mig在清晰度方面是有益的。随你便。