2011-05-19 78 views
61

什麼是最佳實踐?要使用try或使用rescue最佳實踐:嘗試與拯救

user.try(:email) 

VS

user.email rescue nil 

post.try(:comments).try(:first).try(:author) 

VS

post.comments.first.author rescue nil 

是否有使用任何這些有什麼區別?

回答

95

嘗試和營救服務不同的目的。的try目的是爲了節省您不必做:

if user && user.email 

或任何情況下的父對象都不可能是零,這將導致對NilClass一個NoMethodError。 rescue的目的是處理由方法調用引發的異常。如果你期望有一個例外來自user.email,那麼你可以用rescue nil它來防止異常冒泡。

在一般情況下,我會說使用避免rescue nil除非你明確地知道你正在搶救什麼異常,因爲你可以拯救一個不同的異常,你永遠不會知道,因爲rescue nil會阻止你看到它。至少,也許你可以記錄它:

begin 
    ...some code... 
rescue => ex 
    logger.error ex.message 
end 
+0

我希望這有一個鏈接到嘗試源。 – 2012-09-27 16:27:12

+4

這裏是[文檔和源代碼](http://api.rubyonrails.org/classes/Object.html#method-i-try)到'ActiveSuppot#try'。 – 2012-11-20 06:28:54

8

兩者都顯得魚腥味,可以掩蓋其他錯誤。你確定你真的想在那裏得到零嗎?也許最好先檢查是否有任何評論,並明確地覆蓋空案件?

4

Nothing is Something是三弟梅斯一個很好的談話,有助於理解爲什麼@AdamByrtek是當場上,爲什麼我們都應該標誌着失敗的案例在一個更聰明,更面向對象的方式x ? y : nil

+2

非常感謝分享,但這應該是一個評論。 – Stefan 2015-08-13 15:12:02

+0

好點,謝謝。下次會這樣做。這是我的第一反應,所以有點興奮:) – 2015-08-13 15:15:07