🔴 Advanced  ·  Lesson 45

Error Handling

C errors कैसे संभालता है

कई आधुनिक languages में errors के लिए try और catch होते हैं। C में नहीं। इसके बजाय C एक सरल, पुराना तरीका इस्तेमाल करता है: function अपनी return value से बताता है कि वह fail हुआ, और हर बार उस value को जाँचना आपका काम है।

इसके ऊपर, कई standard functions एक विशेष global variable errno set करते हैं जो बताता है कि वे क्यों fail हुए। मिलकर, return-value जाँच और errno ही भरोसेमंद C programs को सुरक्षित रखते हैं।

Return values जाँचना

मूल आदत यह है: fail हो सकने वाले function को call करने के बाद, result इस्तेमाल करने से पहले तुरंत जाँचें कि उसने क्या लौटाया।

C Language
#include <stdio.h>
int main() {
    FILE *fp = fopen("data.txt", "r");
    if (fp == NULL) {              // इस्तेमाल से पहले जाँचें
        printf("Error: file nahi khul saki.\n");
        return 1;
    }
    // यहाँ fp सुरक्षित है
    fclose(fp);
    return 0;
}
Output (file न हो तो):
Error: file nahi khul saki.

errno, perror और strerror

जब कोई standard function fail होता है, वह अक्सर errno set करता है। इसका पढ़ने योग्य विवरण दो तरीकों से print कर सकते हैं।

C Language
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
    FILE *fp = fopen("missing.txt", "r");
    if (fp == NULL) {
        perror("fopen failed");              // message + errno text
        printf("Details: %s\n", strerror(errno)); // वही, string के रूप में
        return 1;
    }
    fclose(fp);
    return 0;
}
Output:
fopen failed: No such file or directory
Details: No such file or directory
💡 errno तुरंत पढ़ें

errno सिर्फ़ आख़िरी fail हुई call दर्शाता है। इसे तुरंत जाँचें, क्योंकि अगली function call इसे बदल सकती है।

File errors संभालना

File का काम errors की classic जगह है: file गायब, locked या भरी हो सकती है। हमेशा fopen जाँचें, और reads तथा writes भी जाँचें।

C Language
FILE *fp = fopen("data.txt", "w");
if (fp == NULL) {
    perror("data.txt nahi khul saki");
    return 1;
}
if (fprintf(fp, "Hello\n") < 0) {   // लिखना भी fail हो सकता है
    perror("Write fail hua");
}
fclose(fp);

सभी file functions के लिए देखें C में file handling

Memory errors संभालना

Memory खत्म होने पर malloc fail हो सकता है। बिना जाँचे इसका result इस्तेमाल करना आम crash है।

C Language
#include <stdio.h>
#include <stdlib.h>
int main() {
    int *arr = malloc(100 * sizeof(int));
    if (arr == NULL) {                // जाँचें!
        printf("Error: memory khatam.\n");
        return 1;
    }
    // arr सुरक्षित इस्तेमाल करें...
    free(arr);
    return 0;
}

malloc और free पर और जानें C में dynamic memory

सर्वोत्तम तरीके

  • fail हो सकने वाले हर function की return value जाँचें।
  • Error को वहीं संभालें जहाँ वह होता है, साफ़ संदेश के साथ।
  • errno तुरंत पढ़ें, इससे पहले कि कोई और call उसे बदले।
  • Error पर बाहर निकलने से पहले सभी resources (files, memory) free करें।
  • System को failure बताने के लिए main से non-zero code लौटाएँ।

आम गलतियाँ

  • Return values अनदेखा करके NULL या invalid result इस्तेमाल करना।
  • errno बहुत देर से पढ़ना, जब कोई और call उसे बदल चुकी हो।
  • Error print करके फिर ऐसे आगे बढ़ना जैसे कुछ fail ही न हुआ हो।
  • Cleanup बिना जल्दी return करके files या memory leak करना।
🏋️ अभ्यास

एक program लिखें जो user के बताए file को खोलने की कोशिश करे। Fail हो तो perror से कारण दिखाएँ, और non-zero exit code लौटाएँ। इसे एक असली file और एक गायब file से test करें।

सारांश

  • C में exceptions नहीं — errors return values से बताए जाते हैं।
  • कई functions errno set करते हैं; fail हुई call के तुरंत बाद पढ़ें।
  • perror error संदेश print करता है; strerror उसे string के रूप में लौटाता है।
  • हमेशा fopen, malloc, reads और writes जाँचें।
  • Failure पर resources cleanup करें और non-zero code लौटाएँ।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

C में error handling कैसे काम करता है?
C में try/catch जैसे built-in exceptions नहीं हैं। इसके बजाय functions समस्या अपनी return value से बताते हैं — जैसे fail होने पर NULL या -1 लौटाना — और आप हर call के बाद उस value को जाँचते हैं। कई library functions एक global variable errno को भी उस code से set करते हैं जो बताता है कि क्या गलत हुआ।
C में errno क्या है?
errno <errno.h> में परिभाषित एक global variable है जिसे कई standard functions fail होने पर set करते हैं। यह एक number रखता है जो विशिष्ट error पहचानता है। इसे fail हुई call के तुरंत बाद पढ़ते हैं, और perror या strerror से पढ़ने योग्य संदेश बना सकते हैं।
perror और strerror में क्या अंतर है?
perror("msg") आपका संदेश और फिर मौजूदा errno का text सीधे standard error पर print करता है। strerror(errno) उस error text को एक string के रूप में लौटाता है, ताकि आप खुद print करें या log में डालें। दोनों एक ही error को अलग रूपों में बताते हैं।
क्या C में अन्य languages जैसे try और catch होते हैं?
नहीं। C में exceptions या try/catch नहीं हैं। Error handling return values और errno जाँचकर हाथ से किया जाता है। गहरी error स्थितियों से बाहर कूदने के लिए setjmp/longjmp है, पर रोज़ का C code हर function का result जाँचने पर निर्भर करता है।
मुझे malloc और fopen की return value हमेशा क्यों जाँचनी चाहिए?
क्योंकि दोनों fail हो सकते हैं — memory खत्म होने पर malloc NULL लौटाता है, और file न खुलने पर fopen NULL लौटाता है। अगर आप बिना जाँचे result इस्तेमाल करें, program अक्सर crash हो जाता है। जाँचने से आप साफ़ संदेश print करके सुरक्षित रूप से बाहर निकल सकते हैं।
← Back to C Tutorial
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.