2017-04-25 11 views
0

はここルビーの例外処理 - 深層下か最上層か?

def prep_food 
    get_veggies() 
    get_fruits() 
end 

def get_veggies() 
    # gets veggies 
rescue Exception => e 
    # => do some logging 
    # => raise if necessary 
end 

def get_fruits() 
    # gets fruits 
rescue Exception => e 
    # => do some logging 
    # => raise if necessary 
end 

最初のものは、第二の方法は、深いダウンそれをしないように、上部層で例外を処理

def prep_food 
    get_veggies() 
    get_fruits() 
rescue Exception => e 
    # => do some logging 
    # => raise if necessary 
end 

def get_veggies() 
    # gets veggies 
end 

def get_fruits() 
    # gets fruits 
end 

セカンド

まず例外処理の2つの方法があります。 2つの違いは何ですか?プログラマがそれらの間をいつ選択する必要がありますか?

答えて

1

例外を特定のもの(rescue FooExceptionではなくrescue Exception)とできるだけ近くに配置することをお勧めします(私のbegin ... rescueブロックには通常1行しか含まれません)。

さらに私は、私が処理することができ、喜んでいる例外からのみ救助します。私が例外を "修正"できない場合、それをキャッチするのは何ですか?

それは言った:私はあなたの秒の例を選択します。同様のタイプの例外を同じように処理しなければならない場合は、ブロックを受け取り、エラー処理を行うメソッドを導入することを検討します。何かのように:

def get_veggies 
    with_foo_error_handling do 
    # gets veggies 
    end 
end 

def get_fruits 
    with_foo_error_handling do 
    # gets fruits 
    end 
end 

private 

def with_foo_error_handling 
    begin 
    yield 
    rescue FooException => e 
    # handle error 
    end 
end 
+0

私は例外を "修正"できない場合、それをキャッチするのは何ですか? 私は自分自身で特定の例外をキャッチすることを好む。しかし、いくつかのケースでは、すべての例外を捕捉し、それらをログに書き込んだ後、再度それを発生させます。これは単なる例であり、例外は例外を捕捉する場所ではなく特定の例外を捕捉することに向けられたものではありません。 – Vizkrig

+0

同意:ロギングと再発生は例外を処理する有効な方法です。無視しても、特別な場合には問題ありません。場合によります... – spickermann

関連する問題