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 इस्तेमाल करने से पहले तुरंत जाँचें कि उसने क्या लौटाया।
#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;
}Error: file nahi khul saki.
errno, perror और strerror
जब कोई standard function fail होता है, वह अक्सर errno set करता है। इसका पढ़ने योग्य विवरण दो तरीकों से print कर सकते हैं।
#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;
}fopen failed: No such file or directory
Details: No such file or directory
errno सिर्फ़ आख़िरी fail हुई call दर्शाता है। इसे तुरंत जाँचें, क्योंकि अगली function call इसे बदल सकती है।
File errors संभालना
File का काम errors की classic जगह है: file गायब, locked या भरी हो सकती है। हमेशा fopen जाँचें, और reads तथा writes भी जाँचें।
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 है।
#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
errnoset करते हैं; fail हुई call के तुरंत बाद पढ़ें। perrorerror संदेश print करता है;strerrorउसे string के रूप में लौटाता है।- हमेशा
fopen,malloc, reads और writes जाँचें। - Failure पर resources cleanup करें और non-zero code लौटाएँ।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
C में error handling कैसे काम करता है?
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 होते हैं?
try/catch नहीं हैं। Error handling return values और errno जाँचकर हाथ से किया जाता है। गहरी error स्थितियों से बाहर कूदने के लिए setjmp/longjmp है, पर रोज़ का C code हर function का result जाँचने पर निर्भर करता है।मुझे malloc और fopen की return value हमेशा क्यों जाँचनी चाहिए?
malloc NULL लौटाता है, और file न खुलने पर fopen NULL लौटाता है। अगर आप बिना जाँचे result इस्तेमाल करें, program अक्सर crash हो जाता है। जाँचने से आप साफ़ संदेश print करके सुरक्षित रूप से बाहर निकल सकते हैं।