मैं अन्य टीम के सदस्यों के साथ सी में एक बड़ी परियोजना विकसित कर रहा हूं और हमें इस बात पर असहमति है कि "यह कभी नहीं हो सकता" त्रुटियों की शैली को कैसे संभाला जाना चाहिए। इसके द्वारा मेरा मतलब है त्रुटि कोड जो वर्तमान में कोड कभी नहीं पहुंच सकता है, लेकिन कोई कोड को संशोधित कर सकता है और संशोधन के बाद यह संभव है कि त्रुटि का मामला पूरा हो जाएगा।सी में त्रुटियों की शैली को "यह कभी नहीं हो सकता" कैसे होना चाहिए?
उदाहरण के लिए, मान लीजिए कि मेरे पास एक ऐसा फ़ंक्शन है जो सफलता पर 0 या वापस देता है - अगर इसे एक पूर्ण तर्क दिया जाता है। क्या मैं स्वाभाविक रूप से करना है:
int err;
struct myctx ctx;
err = callFunction(&ctx);
if (err != 0)
{
abort();
}
या यहाँ तक कि:
int err;
struct myctx ctx;
err = callFunction(&ctx);
if (err == -EINVAL)
{
abort();
}
else if (err != 0)
{
abort();
}
... -EINVAL के दो मामलों और अज्ञात त्रुटि कोड के बीच अंतर करना।
इस त्रुटि प्रबंधन दृष्टिकोण के लाभ यह है कि यह प्रोग्राम (कोड की कुछ पंक्तियां) के लिए आसान है और कोर फ़ाइल के पीछे छोड़ देता है जिसका उपयोग स्थिति को जल्दी से डीबग करने के लिए किया जा सकता है।
हालांकि, कुछ टीम सदस्य इस त्रुटि प्रबंधन दृष्टिकोण से असहमत हैं क्योंकि मैं एक अशुद्ध निकास कर रहा हूं और वर्तमान में कोड कभी भी निरस्त() लाइन तक नहीं पहुंच सकता है, भविष्य में कोई भी कोड को संशोधित करता है और यह पहुंचता है तब abort() लाइन। उनके अनुसार, मुझे नियंत्रित निकास करने और उपयोगकर्ता को कारण मुद्रित करने का प्रयास करना चाहिए। तो, मैं इस के बजाय लगता है कि मुझे क्या करना चाहिए:
int err;
struct myctx ctx;
err = callFunction(&ctx);
if (err == -EINVAL)
{
fprintf(stderr, "Argument was NULL in file %s line %d\n", __FILE__, __LINE__);
exit(1);
}
else if (err != 0)
{
fprintf(stderr, "Error was %d in file %s line %d\n", err, __FILE__, __LINE__);
exit(1);
}
मेरी राय में, यह दूसरी त्रुटि हैंडलिंग रणनीति भी बदतर है, क्योंकि यह है कि इस स्थिति डिबग करने के लिए इस्तेमाल किया जा सकता एक कोर फ़ाइल के पीछे नहीं छोड़ता। इसके अलावा, यह उस कोड में परिणाम देता है जिसमें कोड की अधिक रेखाएं होती हैं।
तो सवाल यह है कि सी में त्रुटियों की शैली को "कभी नहीं किया जा सकता" शैली को कैसे संभाला जाना चाहिए? क्या मुझे एक वर्णनात्मक त्रुटि संदेश के साथ निरस्त या नियंत्रित निकास करना चाहिए?
जबकि मुझे सवाल पसंद है, यह काफी राय आधारित है। – martin
उत्तरार्द्ध बेहतर है - आपको कोर डंप नहीं मिलता है लेकिन आपको पता चलता है कि समस्या कहां हुई है, और उपयोगकर्ता को थोड़ा (थोड़ा) बेहतर अनुभव मिलता है (आप त्रुटि संदेश में सुधार कर सकते हैं, लेकिन कोर डंप कभी नहीं दिखता । अच्छा तुम भी बाहर निकलने के बजाय गर्भपात का उपयोग करके कोर डंप लिख सकता है, बेहतर सर्वांगीण होगा जो, या आप गूगल के coredumper lib का उपयोग डंप और फिर बाहर निकल लिखने के लिए कर सकता है (हालांकि, क्यों सिर्फ इस मामले में गर्भपात नहीं - मर चुका है मृत है कि क्या आप से बाहर निकलने या गर्भपात) – gbjbaanb
धन्यवाद! मुझे लगता है कि कि एक कोर डंप पैदा करने से एक में चल रहे एप्लिकेशन मौजूद है की अनुमति देता है एक coredumper पुस्तकालय। मैं gcore के बारे में पता था, हालांकि पता नहीं था, लेकिन यह एक अलग आदेश है और नहीं एक पुस्तकालय है कि आवेदन मैं programmers.stackexch की जानकारी नहीं थी – juhist