2017-02-24 19 views
0

をトラップ:Rubyの例外ArgumentErrorクラスを考える

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

a = Foo.new()に対して、より有用なエラーを投げるでしょういくつかの方法はありますか?より有用な方法でArgumentErrorをスローするメソッドを作成するにはどうすればよいですか?

これをクラスに組み込みたいと思います。 Programming Ruby siteにはいくつかのエラートラップメカニズムが列挙されていますが、これらのすべてはcatchブロックなどのラップa = Foo.new()に依存しているようです。私はクラス自体の中にトラップするエラーを持っていたいと思います。

+0

「もっと役立つエラー」とは何ですか?あなたの質問はあいまいです。 – sawa

答えて

1

は、デフォルト値を使用して、例えばinitializeメソッド内必要なものは何でもエラー上げることができます

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にデフォルト設定し、initializeブロック内で引数エラーを発生させます。私は答えを更新しました。 – 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

nをしているので、このエラーは奇妙に見えるかもしれませんが、間違った引数を渡すのは非常に具体的なエラーです。それを他のものに再マップすることは必ずしも役立たず、コード内に問題が隠されてしまいます。私はそれをそのまま残しておき、それを正しく呼んでいない場合に起こるようなエラーが予想される。

代替にはデフォルトでキーワード引数を宣言するために、少なくともルビーの新しいバージョンでは、次のとおりです。

def initialize(input1:) 
end 

必要なキーワード引数だし、エラーはより特異的であること:

ArgumentError: missing keyword: input1

欠点はこのように呼び出さなければならないことです:

そのmig明快さの点で有益です。それはあなた次第です。

関連する問題