2013-09-24 54 views
1

我有一個對象,作爲其他幾個父對象。它有一個類似的方法:紅寶石 - 重構,以處理不同類型的錯誤

class Parent 
    def commit 
    begin 
    ... 
    rescue => e 
    ... 
    end 
    end 
end 

class ChildA < Parent 
end 

class ChildB < Parent 
end 

然而,ChildA有一種獨特的方式來表現,當commit拋出一個特定類型的錯誤,UniqueError的。我可以覆蓋該功能的整個commit文件,但是這感覺很尷尬。如果我需要更改begin部分中的主體,它會給我帶來問題,因爲我現在需要在兩個地方更改它。

什麼是最簡潔的方式來重構呢?

回答

4

您不應該吞嚥全部類型的例外與rescue => e。這行代碼應該幾乎不存在。您的異常處理程序應該只捕獲它可以從中有效恢復的異常類型。

改變你的父母,這樣它不會吞下所有的異常,然後抓住他們在你的孩子類:

class Parent 

    def commit 
    # ... 
    end 

end 

class Child < Parent 
    def commit 
    begin 
     super 
    rescue UniqueError => e 
     # ... 
    end 
    end 
end 
+0

如果有一個已知的異常,我需要從以一致的方式營救父類,例如從'ActiveRecord :: ResourceNotFound'救出?你可以有一個父母從一個錯誤中拯救,並且不知何故只是在Child類中擴展它? – Bryce