2012-07-28 12 views
19

मैं दो अलग अलग तरीकों के लिए दो कॉल:त्रुटि मूल्य कैसे सेट करें?

void func1() 
{ 
    // do something 
    if (fail) 
    { 
    // then set errno to EEXIST 

    } 

} 

और दूसरी विधि:

void func2() 
{ 
    // do something 
    if (fail) 
    { 
    // then set errno to ENOENT 

    } 

} 
  1. जब मैं कुछ मूल्य को errno निर्धारित करते हैं, क्या यह क्या करता है? बस त्रुटि की जांच?

  2. मैं कैसे EEXIST को उपरोक्त विधियों func1 में errno और func2 और ENOENT

धन्यवाद

उत्तर

42

सभी व्यावहारिक प्रयोजनों के लिए सेट कर सकते हैं, तो आप एक वैश्विक चर की तरह errno इलाज कर सकते हैं (हालांकि यह आमतौर पर है नहीं)। तो errno.h शामिल और बस का उपयोग करें:

errno = ENOENT; 

आप अपने आप से पूछना चाहिए अगर errno अपने उद्देश्यों के लिए सबसे अच्छा त्रुटि रिपोर्टिंग तंत्र है। क्या त्रुटि कोड को स्वयं कोड वापस करने के लिए इंजीनियर किया जा सकता है?

+11

परंपरागत रूप से, 'त्रुटि' रिपोर्टिंग * सिस्टम त्रुटियों * के लिए उपयोग किया जाता है। क्या आपको लगता है कि आपकी लाइब्रेरी थी या आपका कोड सिस्टम का हिस्सा है? यदि नहीं, त्रुटियों की रिपोर्ट करने के लिए एक और तंत्र का उपयोग करें। –

+3

जरूरी नहीं है, strtol() जैसे उपयोगिता कार्य भी ERANGE लौटते हैं, उदाहरण के लिए, यह वास्तव में _system त्रुटि_ नहीं है। – proteus

+1

एंटनो सेट करने के लिए उपयुक्त स्थान हो सकता है, जो फनओपेन() पर पास किए गए पढ़ने या लिखने के फ़ंक्शन कॉलबैक में होगा। इस मामले में आपके कार्यान्वयन से सिस्टम कॉल (पढ़ें() या लिखना()) के अनुबंध से मेल खाने की उम्मीद है, इसलिए त्रुटि के मामले में -1 को वापस करने और विशिष्ट त्रुटि के साथ त्रुटि सेट करने का अर्थ होगा। – orpheist

3
#include <errno.h> 
void func1() 
{ 
    // do something 
    if (fail) 
    { 
    errno = ENOENT; 
    } 
} 
5

आईएमओ, मानक errno सिस्टम स्तर के लिए डिज़ाइन किया गया। मेरा अनुभव उन्हें प्रदूषित नहीं करता है।

/* your_errno.c */ 
__thread int g_your_error_code; 

/* your_errno.h */ 
extern __thread int g_your_error_code 
#define set_your_errno(err) (g_your_error_code = (err)) 
#define your_errno (g_your_error_code) 

है और यह भी आप अभी भी your_perror(err_code) लागू कर सकते हैं: आप सी मानक errno तंत्र अनुकरण करने के लिए चाहते हैं, आप कुछ परिभाषा की तरह कर सकते हैं। अधिक जानकारी, कृपया glibc के कार्यान्वयन का संदर्भ लें।

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