2011-05-19 15 views
61

सर्वोत्तम अभ्यास क्या है? try का उपयोग करने के लिए या rescue का उपयोग करें?बेस्ट प्रैक्टिस: बचाव बनाम बचाव

user.try(:email) 

वी.एस.

user.email rescue nil 

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

वी.एस.

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

काश इस कोशिश स्रोत का लिंक था। –

+4

यहाँ [दस्तावेज़ और स्रोत] (http://api.rubyonrails.org/classes/Object.html#method-i-try) ActiveSuppot # try' 'करने के लिए है। –

8

दोनों फिश लगते हैं और अन्य बग मास्क कर सकते हैं। क्या आप वाकई वहां शून्य होना चाहते हैं? शायद यह जांचना बेहतर होगा कि पहले कोई टिप्पणी है या नहीं, और खाली मामले को स्पष्ट रूप से कवर करें?

4

Nothing is Something क्यों @AdamByrtek स्थान पर है, जिसकी सहायता से Sandi मेट्स से एक उत्कृष्ट बात है, और इसलिए हम सभी स्मार्ट तथा अधिक में असफल मामलों अंकन किया जाना चाहिए वस्तु उन्मुख तरीका है कि x ? y : nil

+2

ग्रेट टॉक, साझा करने के लिए धन्यवाद, लेकिन यह एक टिप्पणी होनी चाहिए। – Stefan

+0

अच्छा बिंदु, धन्यवाद। इसलिए अगली बार करेंगे। यह मेरी पहली प्रतिक्रिया है, तो थोड़ा उत्तेजित हो रही :) –

संबंधित मुद्दे