2017-02-24 113 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在清晰度方面是有益的。隨你便。