2008-10-23 28 views
29

बस उदाहरण के प्रत्येक टुकड़े के बारे में हर जगह त्रुटि प्रबंधन को छोड़ देता है (क्योंकि यह "समस्या को भ्रमित करता है" जो उदाहरण कोड संबोधित कर रहा है)। मेरा प्रोग्रामिंग ज्ञान मुख्य रूप से किताबों और वेबसाइटों से आता है, और आप शायद ही कभी किसी भी त्रुटि को संभालने में उपयोग करते हैं, अकेले अच्छी चीजें दें।सी ++ त्रुटि हैंडलिंग - उदाहरण कोड के अच्छे स्रोत?

सी ++ त्रुटि हैंडलिंग कोड के अच्छे उदाहरण देखने के लिए कुछ जगह कहां हैं? विशिष्ट पुस्तकों, विशिष्ट ओपन-सोर्स प्रोजेक्ट्स (अधिमानतः फ़ाइलों और कार्यों को देखने के लिए), और विशिष्ट वेब पेज या साइट्स सभी को आभारी रूप से स्वीकार किया जाएगा।

उत्तर

41

हर्ब सुतर की और आंद्रेई Alexandrescu की किताब C++ Coding Standards, त्रुटि हैंडलिंग पर एक पूरा अध्याय और अपवाद

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

प्रत्येक विषय में एक उदाहरण भी शामिल है और मैंने इसे बहुत मूल्यवान संसाधन पाया है।

+1

अच्छा। मैंने अपनी खरीद-सूची में जोड़ा है। (और मैं इस जवाब को भी वोट दूंगा, जैसे ही मैं फिर से मतदान कर सकता हूं। :-)) –

+1

+1, स्रोत नामकरण के कारण, और बुलेट सारांश। – paercebal

6

मैं इस आलेख में चर्चा की अपवाद हैंडलिंग पसंद करता हूं। इसके परिणामस्वरूप साफ कोड होता है और अपवादों को संसाधित करने के लिए ऑब्जेक्ट्स के स्पष्ट निर्माण/हटाना से बचा जाता है। http://www.informit.com/articles/article.aspx?p=373339

+0

अच्छा लेख, धन्यवाद। (मैं आज वोटों से बाहर हूं, मैं इसे कुछ घंटों में वोट दूंगा।) –

4

सी ++ के साथ, आपको वैसे भी कम दिखाई देने वाली त्रुटि हैंडलिंग कोड के साथ समाप्त होना चाहिए, क्योंकि आप अपवादों के लिए भारी भारोत्तोलन छोड़ सकते हैं।

मेरी राय में अपवादों (और सबसे अधिक टूटा हुआ) के साथ सबसे बुनियादी नियम यह है। अपवादों को पकड़ने की कोशिश न करें जब तक कि आपके पास उन्हें संभालने की कोई विशिष्ट योजना न हो।

अपवादों के साथ, आपको कार्यों से लौटाए गए त्रुटि कोडों के बारे में चिंता करने की ज़रूरत नहीं है, क्योंकि अच्छी तरह से डिज़ाइन किए गए फ़ंक्शंस केवल अपवाद फेंक देंगे।

सी में एक विशिष्ट त्रुटि से निपटने के परिदृश्य इस तरह दिखता है:

int DoA() 
{ 
if (location == hellInAHandcart) 
    return ERROR; 
else 
    RETURN OK; 
} 

int DoB() 
{ 
    int err = DoA(); 
    if (err != OK) 
    return err; 
    else 
    return DoSomethingElse1(); 
} 

int DoC() 
{ 
    int err = DoB(); 
    if (err != OK) 
    //Handle My error here in whatever way... 
} 

void DoA() 
{ 
if (location == hellInAHandcart) 
    throw Exception("Gone To Hell in a Handcart"); 
} 

void DoB() 
{ 
    DoA(); 
    DoSomethingElse1(); 
} 

void DoC() 
{ 
    try 
    { 
    DoB(); 
    } 
    catch (Exception &E) 
    { 
    // Handle My error here in whatever way... 
    } 
} 
+0

कि, "किसी भी तरह से" भाग भरने के साथ, बिल्कुल वही चीज़ है जो मैं ढूंढ रहा हूं। –

+0

आप comparaison मेरे लिए सही नहीं है। सी संस्करण में, आप DoSomethingElse1 से पहले DoA के परिणाम का परीक्षण करते हैं। – olipion

+0

@olipion: हाँ, क्योंकि यह एक त्रुटि कोड वापस कर सकता है। अपवादों के साथ, इसे एक त्रुटि कोड वापस करने की आवश्यकता नहीं है, इसलिए जांच करने के लिए कुछ भी नहीं है। – Roddy

13

बनाम "का प्रयोग करें त्रुटि कोड" "अपवाद का उपयोग करें" सी ++ में रहते हुए ... उदाहरणों के सुझाव के रूप में कभी स्पष्ट नहीं है।

प्रोग्राम प्रवाह के लिए त्रुटि कोड का उपयोग करें। यदि आपके पास अपेक्षित त्रुटि है, तो अपवाद फेंक न दें। जैसेआप एक फाइल पढ़ रहे हैं, आप "फ़ाइल नहीं मिली", "फ़ाइल लॉक" के लिए अपवाद फेंक सकते हैं; लेकिन "फ़ाइल का अंत" के लिए कभी भी फेंक न दें।

यदि आप करते हैं, तो आप कभी भी सरल लूप नहीं लिख सकते हैं, आप हमेशा अपवाद हैंडलर में कोड लपेटेंगे। और मत भूलना अपवाद बहुत धीमे हैं, यह बड़े बहु थ्रेडेड सर्वरों में विशेष रूप से महत्वपूर्ण है। (आपके डेस्कटॉप एप्लिकेशन में बिल्कुल इतना महत्वपूर्ण नहीं है)।

दूसरा, अपवाद पदानुक्रमों के साथ बहुत सावधान रहें। आपको लगता है कि Exception कक्षा होना ठीक है, उसके बाद NetException प्राप्त करें, फिर अपने SMTP वर्ग के लिए SMTPException प्राप्त करें। लेकिन जब तक आप बेस क्लास में सामान्य डेटा नहीं रखते हैं, तब तक आपको हमेशा उस पदानुक्रम में हर प्रकार के अपवाद को पकड़ना होगा। जैसे यदि आप अपने SMTPException कक्षा में SMTP त्रुटि का कारण डालते हैं, तो आपको इसे पकड़ना होगा - यदि आप केवल Exception प्रकारों को पकड़ते हैं, तो आपके पास SMTPException सदस्यों तक पहुंच नहीं होगी। इस समस्या के लिए एक अच्छा कामकाज आधार अपवाद वर्ग में एक स्ट्रिंग और एक int सदस्य होना है और व्युत्पन्न प्रकारों के लिए भी उनका उपयोग करें। दुर्भाग्य से std::exception केवल एक स्ट्रिंग :(

कुछ लोगों का कहना यह कर मतलब है कि आप के रूप में अच्छी केवल एक ही अपवाद प्रकार हो सकता है, तो आप हमेशा आधार वर्ग फिर भी लिखते पकड़ेगा विशेष रूप से के रूप में प्रदान करता है।

आप उपयोग करते हैं अपवादों को आपको एक त्रुटि कोड के साथ अधिक डेटा के साथ पॉप्युलेट करने के लिए परेशानी लेनी होगी। त्रुटियों के साथ, आपको उन्हें तुरंत संभालना होगा या वे कोड में खो जाएंगे। अपवाद के साथ, यह कई स्तरों से दूर हो सकता है जहां से यह रॉडडी के उदाहरण में फेंक दिया गया था। DoC कहा जाता है, और DoA से अपवाद 2 स्तर प्राप्त करता है। जब तक आप DoA में कोड के लिए विशिष्ट होने के लिए त्रुटि निर्दिष्ट नहीं करते हैं, तो आपको लगता है कि इसे 0 से फेंक दिया गया थासमारोह। (सरल उदाहरण है, लेकिन मैं कोड जहां एक अपवाद कॉल स्टैक नीचे कई स्तरों संचालित किया गया देखा है। यह डिबग करने के लिए अब सेंट वां था। यह विशेष रूप से OO कार्यक्रमों के लिए लागू होता है)

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

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

मुझे पिछले कुछ वर्षों में पता चला है कि डिबगिंग का सबसे बड़ा सहायक लॉगिंग कर रहा है। लॉग लिखें, बहुत सारे लॉग लिखें।

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