2017-04-25 68 views
0

這裏是處理異常紅寶石中的異常處理 - 向下或在頂層?

首先

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 

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 

在頂層,其中作爲第二種方式做它深處的第一個處理異常的方法有兩種。 這兩者之間有什麼區別,程序員應該在什麼時候選擇它們?

回答

1

我更願意將特殊情況解決爲特定(rescue FooException而不是rescue Exception),並儘可能靠近它們可能引出的行(我的begin ... rescue塊通常只包含一行)。

此外,我只從我能夠並願意處理的例外中拯救。如果我不能「修復」一個異常,捕捉它有什麼意義?

說:我會選擇你的秒示例。如果我必須以相同的方式處理相同類型的異常,那麼我會考慮引入一個方法,該方法需要一個塊並執行錯誤處理。例如:

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