2012-03-08 23 views
10

घोंसला बनाने से यह सवाल एक की अधिक है कि क्या कुछका उपयोग कर और कोशिश/पकड़

सवाल करने के लिए ... सही तरीका है ... वहाँ एक using ब्लॉक और एक try/catch के बीच एक उचित घोंसले आदेश है?

using कथन try/catch के अंदर कथन को ठीक करना और using ब्लॉक के लाभों को बनाए रखना ठीक है? (या अपवाद का कारण होगा खिड़की से बाहर फेंक दिया कथन का उपयोग के समापन हिस्से को मिलता है)

या आप घोंसला using बयान अंदर try/catch और केवल बयान है कि डेटाबेस का उपयोग कर चारों ओर जाना चाहिए?

है ...

try { 
    using(tsmtcowebEntities db = new tsmtcowebEntities()) { 
      violationList = (from a in db.DriverTrafficViolationDetails 
          where a.DriverTrafficViolation.DriverApplicationId == DriverAppId 
          orderby a.DateOfOccurance descending 
          select a).ToList<DriverTrafficViolationDetail>(); 
      GeneralViolation = (from a in db.DriverTrafficViolations 
           where a.DriverApplicationId == DriverAppId 
           select a).FirstOrDefault(); 
    } 
} catch { } 

कम/अधिक से अधिक सही ...

using(tsmtcowebEntities db = new tsmtcowebEntities()) { 
    try { 
      violationList = (from a in db.DriverTrafficViolationDetails 
          where a.DriverTrafficViolation.DriverApplicationId == DriverAppId 
          orderby a.DateOfOccurance descending 
          select a).ToList<DriverTrafficViolationDetail>(); 
      GeneralViolation = (from a in db.DriverTrafficViolations 
           where a.DriverApplicationId == DriverAppId 
           select a).FirstOrDefault(); 
    } catch { } 
} 
+0

क्या आपको वास्तव में प्रदान किए गए कोड में अपने आवेदन के सभी विवरणों की आवश्यकता है? मुझे लगता है कि एक सरल बनाया उदाहरण पर्याप्त होगा। –

+1

खाली पकड़ ब्लॉक एक बेहद खराब प्रोग्रामिंग अभ्यास है। ऐसा मत करो! आप बाद में खेद करेंगे। – phoog

+0

@ जोनाथन रेनहार्ट एक उदाहरण बनाने के लिए कोड के ब्लॉक को कॉपी और पेस्ट करना मेरे लिए आसान था। मैं कोड बना देता हूं जब मुझे लगता है कि दुनिया के लिए कोड डालना बुरा हो सकता है। इस मामले में मुझे कोई नकारात्मक नहीं दिखता है तो क्यों नहीं? – Jared

उत्तर

5

बाद में बेहतर है: यह अंततः मास्किंग अपवादों से बच जाएगा जो अंततः डाई dispose फेंक दिया जाएगा। जाहिर try/catch और Dispose के साथ इस article.

+1

+1 इसे इंगित करने के लिए +1: हालांकि, कोई भी अपवाद जो किसी अपवाद को फेंकता है, मेरी पुस्तक में पहले से ही "खराब" है :( –

+0

जब तक आप स्पष्ट रूप से उपयोग कथन द्वारा फेंकने वाली त्रुटियों को पकड़ना नहीं चाहते हैं। कुछ ऐसा करने की तरह (FileStream fs = new FileStream (... यदि पथ अमान्य या पहुंच योग्य है, तो आसानी से फेंक सकता है, और आपके उपयोग ब्लॉक की सामग्री से भी फेंकने की अधिक संभावना हो सकती है। –

0

मैं का उपयोग कर के भीतर ट्राई/कैच रखने का सुझाव देते हैं, क्योंकि या नहीं, एक अपवाद है की परवाह किए बिना फेंक आप प्रकार के डिस्पोजेबल इकाई कंटेनर

+0

मुझे लगता है कि यह मेरे प्रश्न का हिस्सा था। मैं उपयोग के अंदर कोशिश/पकड़ने घोंसले की कार्यक्षमता में 100% सकारात्मक था। मैं अधिक अनिश्चित था अगर कोई उपयोग कथन निष्क्रिय और अभी भी ऑब्जेक्ट/संसाधनों का निपटान कर सकता है ... मेरे पास कुछ कोड है जिस पर मैं काम कर रहा हूं और यह वर्तमान में दोनों तरह से है। मैं यह पता लगाने की कोशिश कर रहा हूं कि मुझे कोड से गुजरना है और यह सुनिश्चित करना है कि कोशिश/पकड़ हमेशा घोंसला हो या नहीं। आपने पुष्टि की है कि मैंने मूल रूप से क्या अपेक्षा की थी, इसलिए मैं जवाब स्वीकार करूंगा! @GlennFerrieLive – Jared

+0

'उपयोग' अपने स्वयं के प्रयास को पकड़ता है। 'निपटान' समारोह हमेशा कहा जाएगा। –

+1

-1 निपटान घोंसले के बावजूद बुलाया जाएगा। @ जेरेड: का उपयोग एक कोशिश के अंत में संकलित किया गया है (जेएन के रूप में प्रयास करने की कोशिश नहीं की गई)। अंततः ब्लॉक में निपटान कहा जाता है, इसलिए इसे कहा जाता है कि अपवाद पकड़ा गया है या नहीं। – phoog

2

यह वास्तव में शैली की बात है निपटाने चाहिए और कैसे आप db के दायरे में रखना चाहते संकीर्ण:

यदि उपयोग db चर के प्रयास/पकड़ ब्लॉक के अंदर है तो केवल प्रयास भाग के भीतर पहुंच योग्य होगा।

यदि उपयोग करने की कोशिश/पकड़ ब्लॉक के बाहर है तो यह पकड़ हिस्से के भीतर दिखाई देगा।

भले ही, चर का सही ढंग से निपटान किया जाएगा क्योंकि उपयोग ब्लॉक एक कोशिश/अंत के बराबर है।

व्यक्तिगत रूप से मैं सोच रहा हूं कि आपको वहां अपवादों को पकड़ने की आवश्यकता क्यों है और यदि कुछ भी हो, तो आप उनके साथ ऐसा करने में सक्षम हैं।

+0

मैं अक्सर AJAX के माध्यम से बुलाए जाने वाले कार्यों पर प्रतिक्रिया के लिए स्थिति कोड सेट करने के लिए प्रयास/पकड़ का उपयोग करता हूं। – Jared

1

using घोंसले देखें रास्तों पर सभी बुलाया जाएगा। अनुमानित रूप से नियंत्रण हमेशा आंतरिक -> बाहरी क्षेत्रों (दोनों अपवादों और सामान्य प्रवाह वापसी के लिए) से बहती है।

सवाल तो यह है: जबपकड़Dispose और के संबंध में निष्पादित किया जाना चाहिए कि क्यापकड़ के दायरे होना चाहिए? इसका जवाब कोड के अनुसार भिन्न होगी लेकिन स्पष्ट रूप से "अंदर" होना चाहिए अगर db के लिए उपयोग "बाहर की दुनिया में" के लिए आवश्यक है और अगर कोडusing * के भाग के रूप निष्पादित अपवाद के स्रोत हो सकता है।

(इसके अलावा, खाली पकड़ ब्लॉक को भावुक कर रहे हैं! मैं यह सोचते हैं रहा हूँ वे "प्रदर्शन के उद्देश्य से" देखते हैं।)

मुबारक कोडिंग।


* ध्यान दें कि एक बाहरी-पकड़ new tsmtcowebEntities() से या (जे.एन. से कहा के रूप में) Dispose, किसी भी मौजूद होना चाहिए फेंका अपवाद पकड़ लेंगे। (यह एक और विषय पूरी तरह से है यदि यह किसी अपवाद को फेंकने के लिए स्वीकार्य है ;-) मैं जितना संभव हो सके स्रोत के करीब अपवादों को पकड़ना पसंद करता हूं और अपवादों को छोड़ देता हूं, मुझे नहीं पता कि "खून बहने" से निपटने के लिए कैसे कुछ शीर्ष-स्तरीय संरचनाओं (उदाहरण के लिए ईवेंट हैंडलर) में

+0

मुझे वास्तव में उनके कोड में कुछ जगहें हैं क्योंकि मेरे पास एल्माह किसी को पकड़ने के लिए सेट है अपवाद। मेरी todo सूची पर वापस जाना है और बहुत सारे कोड को फिर से कारक करना है और मेरे प्रयास/पकड़ ब्लॉक उन क्षेत्रों में से एक हैं और साथ ही मेरे पास त्रुटि लॉगिंग सेटअप में सुधार भी है। – Jared