2011-11-14 15 views
9

संभव डुप्लिकेट:
Error handling in C codeसी में विफल फ़ंक्शन कॉल के लिए आप किस वापसी मूल्य का उपयोग करना चाहिए?

दें मान लीजिए कि आप एक समारोह है:

int MightWork(){ 
    // if it works 
    return x; 

    // if it fails 
    return y; 

} 

क्या x और y होना चाहिए?

क्योंकि मैं एक और समारोह है:

if (MightWork){ 
    // do stuff #1 
}else{ 
    // do stuff #2 
} 

मैं इस विशिष्ट उदाहरण के लिए पता है, 1 की वापसी मूल्य का उपयोग कर दूसरी कोड ब्लॉक ले "# 1 सामान है" करने के लिए होगा और 0 से वापसी मान का उपयोग कर दूसरे कोड ब्लॉक को "सामान # 2"

मेरा प्रश्न यह है कि ऐसा करने के लिए सी में पसंदीदा शैली क्या है? क्या फ़ंक्शन के लिए 0 का रिटर्न वैल्यू सफलता का संकेत देता है और कोई अन्य मान विफलता को इंगित करता है? या ठीक इसके विपरीत? या 0 के तहत मूल्य?

मैं यह सुनिश्चित करना चाहता हूं कि मैं वर्तमान सी के साथ अपना सी कोड लिख रहा हूं। धन्यवाद!

+0

यह धागा चक्र एक ही बात: http://stackoverflow.com/questions/385975/error-handling-in-c-code – Laserallan

उत्तर

15

गैर सूचक सफलता के लिए/असफल:

  • 0 => सफलता
  • -1 => असफल

सूचक कार्यों के लिए:

  • NULL => असफल
  • सब कुछ => सफलता
+0

आप में कई कॉल में त्रुटियों का पता लगाने के लिए एक रास्ता के रूप में इस्तेमाल किया है -1 एक कॉम्पैक्ट तरीके से? जैसे 'err + = func1(); गलती + = func2(); अगर (गलती <0) printf ("त्रुटि"); ' – Brian

+0

तो यदि सफलता वापसी मूल्य 0 है, तो यह समकक्ष बयान होगा:" अगर (my_function()) "और" if (my_function() == 0) " ? – Paradox

2

ऐतिहासिक रूप से, 0 का रिटर्न मूल्य आमतौर पर सफलता का संकेत देता है, जबकि -1 का रिटर्न वैल्यू विफलता को इंगित करता है। फ़ंक्शन के उपयोगकर्ता को वापसी स्थिति के बारे में अधिक विस्तृत जानकारी देने के लिए आप अधिक आउटपुट मान भी उपयोग कर सकते हैं। वैश्विक त्रुटि कोड चर सेट करने की यह एक और परंपरा है, उदाहरण देखें। विंडोज़ पर GetLastError और SetLastError

0

1 = सच 0 = झूठी

सामान्य रूप में ....

कभी कभी लोगों के लिए उपयोग -1 "त्रुटि"

एक और तरीका यह संभाल करने enums और कभी कभी #defines साथ है के लिए । हालांकि कई बार लोग इसका उपयोग नहीं करते हैं जब तक कि कई त्रुटियां न हो .... और आमतौर पर कई नकारात्मक संख्याओं द्वारा कई त्रुटियों को संभाला जाता है।

2

एक सशर्त संदर्भ में, पूर्णांक "शून्य" होने पर पूर्णांक का मूल्यांकन करते हैं और शून्य होने पर "झूठा" होता है, इसलिए यदि आप उस तरीके से फ़ंक्शन का उपयोग करना चाहते हैं, तो सुनिश्चित करें कि आपको विफलता पर 0 वापस करना चाहिए, और सुनिश्चित करें सफल शाखा में 0 वापस करने के लिए नहीं।

2

दोनों का उपयोग किया जाता है, और यह आमतौर पर इस पर निर्भर करता है कि एकाधिक त्रुटि कोड वापस किए जा सकते हैं या नहीं।

यदि आपका फ़ंक्शन केवल "सफल" या "असफल" कोई अतिरिक्त जानकारी के साथ नहीं होगा, तो मैं आपको सफलता के लिए 0 विफलता और 1 सफलता के लिए वापस लौटने की सलाह दूंगा, क्योंकि यह सरल और अधिक अर्थात् मान्य है।

यदि आपका फ़ंक्शन एकाधिक स्थिति कोडों के साथ विफल हो सकता है, तो जाने के लिए एकमात्र तरीका 0 है और विभिन्न स्थितियों का प्रतिनिधित्व करने में विफलता के लिए अन्य मान हैं।

-2

#define का उपयोग करें।

#define TRUE 1 
#define FALSE 0 

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

2

कोई भी सही जवाब नहीं है।

यदि आपके फ़ंक्शन को किसी प्रकार की भविष्यवाणी के मूल्यांकन के रूप में नामित/दस्तावेज किया गया है, तो उसे "सत्य" के लिए एक गैर-शून्य मान (1 सुविधाजनक) और 0 झूठी के लिए वापस लौटना चाहिए।

यदि आपका फ़ंक्शन पॉइंटर लौटाता है, तो 0 (शून्य सूचक) विफलता की रिपोर्ट करने का एकमात्र उचित तरीका है। (void *)-1, MAP_FAILED, SEM_FAILED लौटने जैसे सम्मेलन, और ऐसे घृणित हैं और कॉपी नहीं किए जाने चाहिए। यदि आपको विफलता के कारण की रिपोर्ट करने की आवश्यकता है, तो अतिरिक्त कार्य int *errorcode तर्क जोड़ें और अपने फ़ंक्शन के अंत में if (errorcode) *errorcode = reason; शामिल करें ताकि कॉलर्स को नल पॉइंटर पास करने के कारण की परवाह न हो।

यदि आपका फ़ंक्शन एक संख्यात्मक मान देता है जैसे कि केवल कुछ रेंज मानों को समझ में आता है (उदाहरण के लिए केवल गैर-ऋणात्मक पूर्णांक, या केवल सीमित फ़्लोटिंग पॉइंट मान) तो त्रुटि कोड के लिए आउट-ऑफ-रेंज मानों का उपयोग करें (जैसे ऋणात्मक पूर्णांक या NaN/अनंतता) त्रुटि कोड के रूप में। यदि आपके पास पर्याप्त संभावित कोड नहीं हैं (उदाहरण के लिए केवल NaN) तो ऊपर वर्णित int *errorcode दृष्टिकोण का उपयोग करें।

0

मेरी राय में दोनों काम कर सकते थे, लेकिन अलग-अलग मामले में।

  1. आप समारोह, कुछ आपरेशन करने के लिए सफलता के लिए 0 वापसी करते हैं, तो -1 के लिए विफल रहा है, और उचित मूल्य के लिए errno सेट इतना है कि फोन करने वाले की विफलता के विस्तार पता करने के लिए यह जांच कर सकता है। कभी-कभी लोग अलग-अलग असफलताओं के अर्थ के लिए विभिन्न रिटर्न मानों का भी उपयोग करते हैं।

  2. आप कुछ स्थिति का परीक्षण करने समारोह चाहते हैं, तो आप इसे किसी TRUE या FALSE लौट कर, और बाद में if (XXX() == TRUE) उपयोग करना चाहिए। if (XXX()) का स्वरूप अनुशंसित नहीं है, हालांकि कई लोग टाइपिंग कीबोर्ड के समय को बचाने के लिए ऐसा करते हैं। TRUE और FALSE सी में डेटा प्रकार में निर्मित नहीं है, हालांकि कई प्रोग्रामिंग वातावरण इसे TRUE = 1 और FALSE = 0 के रूप में परिभाषित करेंगे, यदि आप ऐसे वातावरण में काम नहीं कर रहे हैं तो आप इसे स्वयं कर सकते हैं।

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

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