2010-07-06 14 views
11

मैं .net 3.5 में एएसपीनेट वेब ऐप्स बना रहा हूं और मैं जानना चाहता था कि कब उपयोग करना है और कब उपयोग नहीं करना है अंततः ब्लॉक? विशेष रूप से, मेरे अधिकांश प्रयासों को संग्रहीत प्रोसेस निष्पादित करने और टेक्स्टफील्ड या ग्रिडव्यू पॉपुलर करने के आसपास लपेटा जाता है? क्या आप रीच कैच EVERYTIME का उपयोग करते हैं जब आप एक संग्रहित प्रो निष्पादित करते हैं और डेटा डिस्प्ले नियंत्रण पॉप्युलेट करते हैं?उपयोग करने के लिए कब और कब उपयोग नहीं करना है

मेरे कोड ब्लॉक आमतौर पर लगता है कि:

protected void AddNewRecord() 
    { 
     try 
     { 
      //execute stored proc 
      // populate grid view controls or textboxes 
     } 
     catch (Exception ex) 
     { 
      //display a messagebox to user that an error has occured 
      //return 
     } 
     finally 
     { } 
    } 
+0

यह भी देखें: http://stackoverflow.com/questions/505471/how-often-should-i-use-try-and-catch-in-c – 0x49D1

+0

"सीएलआर के माध्यम से सी #" पुस्तक, तीसरी संस्करण जे। रिक्टर द्वारा। इसमें अपवाद हैंडलिंग अवधारणाओं को बहुत विस्तार से शामिल किया गया है, और निश्चित रूप से एक अच्छा संदर्भ है। – ileon

उत्तर

10

जवाब है, "यह निर्भर करता है"।

आप प्रत्येक परमाणु संचालन के आसपास try{...} catch {...} का उपयोग करना चाह सकते हैं ताकि यदि कोई समस्या हो तो आप अंतिम अच्छी स्थिति (लेनदेन का उपयोग करके) वापस रोल कर सकते हैं। यह एक या कई संग्रहीत प्रक्रिया हो सकती है - यह आपके आवेदन पर निर्भर करती है।

यदि आप अपवाद को फँस रहे हैं, तो सुनिश्चित करें कि आप स्पष्ट हैं कि आप कौन से अपवादों को पकड़ते हैं। आपके पास catch (Exception ex) या catch() नहीं होना चाहिए - जिसे "सभी को पकड़ें" अपवाद हैंडलिंग के रूप में जाना जाता है - लेकिन इसके बजाय विशिष्ट पकड़ विवरण catch (IndexOutOfRangeException ex) (उदाहरण के लिए) होना चाहिए।

हालांकि, अगर आप अपवाद को संभाल नहीं सकते हैं या कुछ भी नहीं है जिसे आप साफ करने के लिए कर सकते हैं, तो आपको इसे फँसाना नहीं चाहिए।

+0

"परमाणु" ऑपरेशन से आपका क्या मतलब है? – user279521

+2

http://en.wikipedia.org/wiki/Atomic_operation –

+3

@ user279521 - "परमाणु" - में है कि यह किसी भी आगे विभाजित नहीं किया जा सकता एक परमाणु की तरह। इसमें कई कदम हो सकते हैं लेकिन प्रत्येक चरण का कोई मतलब नहीं है यदि इसे स्वयं किया जाता है। उदाहरण के लिए, यदि आप अपने कोड में एक बग ठीक करते हैं, लेकिन इसके लिए कई वर्गों में संपादन की आवश्यकता होती है तो सभी फाइलों में चेक इन परमाणु कहा जाता है क्योंकि किसी की जांच में कोई मतलब नहीं है। – ChrisF

0

अधिकांश समय आपको अपवादों को पकड़ना नहीं चाहिए। कुछ स्थानों जहां यह अपवाद को पकड़ने के लिए समझ में आता है उदा।

जब आप उस विशिष्ट अपवाद से पुनर्प्राप्त कर सकते हैं। जब आपको इसे लॉग करने या इसकी रिपोर्ट करने की आवश्यकता होती है (उदा। उपयोगकर्ता को) - आमतौर पर आपके कोड में शीर्ष स्तर पर। जब आपके कोड का कॉलर अपवादों को संभाल नहीं सकता है, तो आपको उन्हें किसी अन्य त्रुटि प्रारूप में रूपांतरित करने की आवश्यकता है।

इसके अलावा, उपयोग करने वाले ब्लॉक स्टेटमेंट का उपयोग वास्तव में IDISposable ऑब्जेक्ट्स पर निपटान करने के लिए किया जा सकता है, जो प्रयास करने की आवश्यकता को हटा देता है ... अंत में।

+0

क्या होगा यदि मैं उपयोगकर्ता को एक संदेशबॉक्स प्रदर्शित करना चाहता हूं "डेटा लोड करते समय एक त्रुटि हुई"? मैं कोशिश कर सकता हूं कि एक कोशिश कैच ब्लॉक के बिना? – user279521

+0

आप अपवाद –

+0

साथ संदेश बॉक्स पॉप अप करने एक कोशिश पकड़ की जरूरत है जैसा कि मैंने कहा, आप केवल अपने कोड के शीर्ष स्तर पर इस की जरूरत है: "जब आप इसे प्रवेश करें या यह उपयोगकर्ता के लिए रिपोर्ट (उदाहरण के लिए ,. करने की जरूरत है) - आमतौर पर आपके कोड में शीर्ष स्तर पर। " – Polyfun

4

आपको केवल try catch का उपयोग करना चाहिए, जब आप पकड़ ब्लॉक में अपवाद को संभालने का इरादा रखते हैं। हैंडल द्वारा मेरा मतलब है, त्रुटि लॉग करें, त्रुटि के कारण एक अलग पथ चुनें। यदि आप केवल इसे फिर से फेंकने का इरादा रखते हैं, तो पकड़ने की कोशिश करने में कोई बात नहीं है।

+1

यदि आप त्रुटि लॉग करना चाहते हैं, तो उस बिंदु पर अपवाद को पकड़ने की कोई आवश्यकता नहीं है, इसके बजाय आप अपने कोड से बाहर निकलने के बिंदु पर पकड़ सकते हैं जो आपके कोड में कहीं भी होने वाले अपवादों को लॉग करता है। – Polyfun

+0

आप एक अच्छा मुद्दा बनाते हैं, लेकिन मुझे लगता है कि यह बड़े पैमाने पर आवेदन के समग्र वास्तुकला पर निर्भर करता है। असल में मैं इसे केवल एक उदाहरण के रूप में प्रदान कर रहा था कि संभवतया प्रयास करने का प्रयास कब किया जाए। – kemiller2002

+0

क्या होगा यदि कोई ऑब्जेक्ट का आविष्कार ब्लॉक निष्पादन के भीतर सभी कोड रखने पर भरोसा करता है? मुझे लगता है कि इस तरह के मामले में, कोड को एक ब्लॉक द्वारा संरक्षित किया जाना चाहिए जो ऑब्जेक्ट के आविष्कारों को पकड़ने पर समय पर अपवाद तब होता है जब ऑब्जेक्ट स्पष्ट रूप से ऑब्जेक्ट को अमान्य कर देगा। यदि अपवाद भ्रष्ट वस्तु को त्यागने के लिए कॉलिंग कोड का कारण बनता है, भ्रष्ट वस्तु को त्यागने का कार्य समस्या को हल करेगा। यदि कॉलिंग कोड दूषित ऑब्जेक्ट का उपयोग करने का प्रयास करता है, तो इस तरह के प्रयासों को अपवादों का कारण बनना चाहिए जिससे चीजों को हल नहीं किया जाता है या वे पूरी तरह से मर जाते हैं। – supercat

1

जैसा कि अन्य ने कहा है, यह निर्भर करता है। मैं दो स्थितियों में कोशिश/पकड़/अंत में ब्लॉक का उपयोग करते हैं:

  • मैं किसी तरह बस इसे फिर से फेंकने के अलावा अन्य में अपवाद को संभालने के लिए की जरूरत है।

  • मुझे finally ब्लॉक में कुछ संसाधनों को साफ़ करने की आवश्यकता है।

उन दो स्थितियों के अलावा, मैंने कॉलिंग कोड को होने वाली किसी भी अपवाद को संभालने दिया।

+0

एक तरफ, 'उपयोग' मूल रूप से संसाधनों की सफाई के लिए 'प्रयास-अंत' ब्लॉक है ('निपटान' के माध्यम से)। – Brian

+0

@ ब्रायन - सही, लेकिन साफ-सुथरा करने की हर चीज को हमेशा आईडीस्पोजेबल (या निपटान) लागू नहीं करता है। –

1

इसके अलावा क्या अन्य लोगों ने कहा है, ऐसा करने से बचने के लिए सुनिश्चित हो:

try 
    { 
     throw new ApplicationException("Fake sql ex"); 
    } 
    //catch and do nothing. swallowing exceptions 
    catch(Exception){ }     
+2

पोकेमोन अपवाद हैंडलिंग: सभी को पकड़ना होगा! –

0

क्या Exception आप संग्रहीत proc से उम्मीद कर रहे हैं रहा है?, कुछ भी है कि विशिष्ट अपवाद आप को पकड़ने के लिए करने के लिए Application वस्तु द्वारा पकड़ा हो जाएगा चाहते हैं फिट नहीं करता है आप pokemon exception handling का उपयोग नहीं करते हैं और जानते हैं आपके आवेदन करने के लिए आशा की जाती है कि वास्तव में क्या प्रदान करना।

दूसरे शब्दों में catch {} या catch (Exception), लेकिन विशेष अपवाद हैंडलिंग का उपयोग नहीं करते:

catch(SqlException e) 
{ 
    // Log stacktrace and show a friendly error to your user 
} 

Application.Error घटना है जहां अप्रत्याशित व्यवहार पकड़ा जाना चाहिए और केवल आप के लिए एक ग्राहक वापसी की तुलना में पता लगाने के लिए आसान है कह रही है "मेरे खेतों में कुछ भी प्रदर्शित नहीं हो रहा है"।

+0

कोई विशेष अपवाद अपेक्षित नहीं है, लेकिन "केवल सुरक्षित होने के लिए", मुझे अतीत में बताया गया है कि सभी डेटाबेस कॉल को पकड़ने वाले ब्लॉक में लपेटा जाना चाहिए। – user279521

+0

लेकिन आपको अपवाद पकड़ने की आवश्यकता नहीं है। आप खुशी से सभी SqlExceptions या जो भी डेटाबेस आप उपयोग कर रहे हैं उसे पकड़ सकते हैं।अगर कुछ और फेंक दिया जाता है तो शायद आप चुपचाप मरने की बजाए इसके बारे में जानना चाहेंगे –

0

उपयोग "कोशिश पकड़" अंतरतम पाश कि क्रियान्वित जब किसी विशेष अपवाद तब होता है रखना चाहिए के भीतर। सावधान रहें कि यदि आपके पास एक लूप है जो 10,000 बार निष्पादित करता है और अपवाद होता है उदा। दसवीं पुनरावृत्ति जो 9, 9 0 9 को प्रभावित नहीं करेगी, यह अपवाद को पकड़ने और लूप को जारी रखने के लिए उपयोगी हो सकती है। दूसरी ओर, यदि अपवाद एक गलती है कि 11 वीं, 12 वीं, 13 वीं, आदि लूप के माध्यम से बार भी असफल करने जा रहे हैं पता चलता है इंगित करता है, यह बहुत तेजी से अपवाद पाश को मारने से पुन: प्रयास करने के लिए एक ऑपरेशन रखने के लिए जाने के लिए किया जाएगा वह काम नहीं करेगा।

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