c++ - अपवाद हैंडलिंग का उपयोग कब और कैसे किया जाना चाहिए?




windows exception (5)

मैं अपवाद हैंडलिंग के बारे में पढ़ रहा हूँ। मुझे अपवाद हैंडलिंग के बारे में कुछ जानकारी मिली है, लेकिन मेरे कुछ प्रश्न हैं:

  1. अपवाद फेंकने के लिए कब?
  2. अपवाद फेंकने के बजाय, क्या हम त्रुटि को इंगित करने के लिए रिटर्न वैल्यू का उपयोग कर सकते हैं?
  3. अगर मैं अपने सभी कार्यों को ट्राइक-कैच ब्लॉक से सुरक्षित करता हूं, तो क्या यह प्रदर्शन को कम नहीं करेगा?
  4. अपवाद हैंडलिंग का उपयोग कब करें?
  5. मैंने एक प्रोजेक्ट देखा जहां उस परियोजना में प्रत्येक समारोह में एक कोशिश-पकड़ ब्लॉक था (यानी पूरे समारोह के अंदर कोड ट्राइक-कैच ब्लॉक से घिरा हुआ है)। क्या यह एक अच्छा अभ्यास है?
  6. कोशिश-पकड़ और __try __except के बीच क्या अंतर है?

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

मैं स्वीकार किए गए उत्तर के इस पहलू से असहमत हूं। एक अपवाद फेंकने से बेहतर नहीं है। यदि अपवाद केवल रन-टाइम त्रुटियों (या "बाहरी समस्याएं") के लिए उपयुक्त थे, तो std::logic_error क्या है?

एक तर्क त्रुटि लगभग परिभाषा के अनुसार है कि एक ऐसी स्थिति जो एक कार्यक्रम को जारी रखने से रोकती है। यदि कार्यक्रम एक तार्किक निर्माण है, और उस तर्क के डोमेन के बाहर एक शर्त होती है, तो यह कैसे जारी रख सकता है? जब आप कर सकते हैं इनपुट इनपुट इकट्ठा करो, और एक अपवाद फेंक दो!

ऐसा नहीं है कि पूर्व कला नहीं है। std::vector , नाम लेकिन एक के लिए, एक तर्क त्रुटि अपवाद फेंकता है, अर्थात् std::out_of_range । यदि आप मानक पुस्तकालय का उपयोग करते हैं और मानक अपवादों को पकड़ने के लिए शीर्ष-स्तरीय हैंडलर नहीं है - यदि केवल कॉल () और बाहर निकलने के लिए (3) - तो आपके प्रोग्राम अचानक चुप, समाप्ति के अधीन हैं।

एक जोर मैक्रो एक बहुत कमजोर गार्ड है। कोई वसूली नहीं है। जब तक, आप एक डीबग बिल्ड नहीं चला रहे हैं, इस मामले में कोई निष्पादन नहीं है । जोरदार मैक्रो एक युग से संबंधित है जब गणना आज की तुलना में तीव्रता के 6 आदेश धीमी थी। यदि आप तर्क त्रुटियों के परीक्षण के लिए परेशानी में जा रहे हैं, लेकिन उस परीक्षण का उपयोग न करने पर, उत्पादन में, आपको अपने कोड में बहुत अधिक आत्मविश्वास होगा!

मानक पुस्तकालय तर्क त्रुटि अपवादों के लिए प्रदान करता है, और उन्हें नियोजित करता है। वे एक कारण के लिए हैं: क्योंकि तर्क त्रुटियां होती हैं, और असाधारण हैं। सिर्फ इसलिए कि सी सुविधाओं का दावा इस तरह के एक आदिम (और, तर्कसंगत, बेकार) तंत्र पर भरोसा करने का कोई कारण नहीं है, जब कोई अपवाद नौकरी को इतना बेहतर तरीके से संभालता है।


1. परिणाम में अपवाद प्राप्त करने की संभावना होने पर या समस्या के बीच कहीं भी अपवाद जांच कोड में शामिल किया गया है।

2. केवल उन मामलों के साथ प्रयास-पकड़ ब्लॉक का उपयोग करें जहां इसकी आवश्यकता है। प्रत्येक कोशिश-पकड़ ब्लॉक का उपयोग अतिरिक्त शर्त में जोड़ें जो निश्चित रूप से कोड के अनुकूलन को कम कर देता है।

3. मुझे लगता है कि _try_except एक वैध चर नाम है ....


इसके लिए सर्वश्रेष्ठ पढ़ें

पिछले डेढ़ दशक में अपवाद हैंडलिंग के बारे में काफी बात की गई है। हालांकि, अपवादों को सही तरीके से कैसे संभालना है, इस पर आम सहमति के बावजूद, उपयोग पर एक विभाजन मौजूद है। अनुचित अपवाद हैंडलिंग स्पॉट करना आसान है, टालना आसान है, और एक साधारण कोड (और डेवलपर) गुणवत्ता मीट्रिक है। मुझे पता है कि पूर्ण नियम करीबी दिमागी या अतिरंजित के रूप में आते हैं, लेकिन एक सामान्य नियम के रूप में आपको कोशिश / पकड़ का उपयोग नहीं करना चाहिए

http://codebetter.com/karlseguin/2010/01/25/don-t-use-try-catch/


कई सी / सी ++ शुद्धवादी अपवादों को पूरी तरह से हतोत्साहित करते हैं। मुख्य आलोचनाएं हैं:

  1. यह धीमा है - बेशक यह वास्तव में "धीमा" नहीं है। हालांकि, शुद्ध सी / सी ++ की तुलना में, ओवरहेड का थोड़ा सा हिस्सा है।
  2. यह बग पेश करता है - यदि आप अपवादों को सही तरीके से संभाल नहीं पाते हैं, तो आप अपवाद को फेंकने वाले फ़ंक्शन में क्लीन-अप कोड को याद कर सकते हैं।

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


मूलभूत अंतर है:

  1. एक आपके लिए त्रुटि प्रबंधन करता है।
  2. एक आप अपना खुद का करते हैं।

    • उदाहरण के लिए, आपके पास एक अभिव्यक्ति 0 divide error बना सकती है। प्रयास पकड़ने का उपयोग करना 1. त्रुटि होने पर आपकी सहायता करेगा। या आपको if a==0 then.. 2.

    • यदि आप अपवाद को पकड़ने की कोशिश नहीं करते हैं तो मैं इसे तेज़ी से नहीं सोचता, यह केवल बाईपास है, अगर error हुई तो इसे बाहरी हैंडलर पर threw जाएगा।

अपने आप को सौंपना मतलब है कि समस्या आगे नहीं बढ़ती है, फिर कई मामलों में गति में लाभ होता है, लेकिन हमेशा नहीं।

सुझाव: सरल और तर्कसंगत मामले में बस अपने आप को संभालना।





exception-handling