C xatolarni qayta ishlash
C tilida xatolarni qayta ishlash
Xatolarni qayta ishlash dasturingizdagi muammolarni — masalan, ochib bo‘lmaydigan faylni yoki ajratib bo‘lmaydigan xotirani — aniqlash va ularga javob qaytarish imkonini beradi. Shunda dasturingiz ishdan chiqmaydi va kutilmagan tarzda ishlamaydi.
Ba’zi tillardan farqli ravishda, C tilida o‘rnatilgan istisnolarni qayta ishlash mexanizmi (masalan, try/catch) yo‘q. Buning o‘rniga C qaytariladigan qiymatlar, global xato kodlari hamda perror() va strerror() kabi yordamchi funksiyalardan foydalanadi.
Qaytariladigan qiymatlardan foydalanish
Oldingi bobda fopen() kabi funksiyalar biror narsa noto‘g‘ri ketganda NULL qaytarishini bilib oldingiz.
Dasturingiz ishdan chiqishidan oldin xatolarni aniqlash va qayta ishlash uchun if operatori yordamida NULL qaytganini tekshirishingiz mumkin.
Quyidagi misolda mavjud bo‘lmagan faylni ochishga harakat qilamiz. fopen() muvaffaqiyatsiz tugagani uchun u NULL qaytaradi va biz xato haqida xabar chiqaramiz:
Misol: fopen() muvaffaqiyatsiz tugaydi
#include <stdio.h>
int main() {
FILE *fptr = fopen("nothing.txt", "r");
if (fptr == NULL) {
printf("Error opening file.\\n");
return 1;
}
fclose(fptr);
return 0;
}
Natija:
Error opening file.
Batafsil ma’lumot olish
Agar nima noto‘g‘ri ketgani haqida batafsilroq ma’lumot olmoqchi bo‘lsangiz, perror() funksiyasidan foydalanishingiz mumkin.
U siz bergan xato xabarini, undan keyin esa oxirgi yuz bergan xatoning tavsifini chiqaradi:
Misol: fopen() bilan birga perror()
#include <stdio.h>
int main() {
FILE *f = fopen("nothing.txt", "r");
if (f == NULL) {
perror("Error opening file");
return 1;
}
fclose(f);
return 0;
}
Natija:
Error opening file: No such file or directory
strerror() va errno bilan ishlash
errno — oxirgi muvaffaqiyatsiz amalning xato kodini saqlaydigan global o‘zgaruvchi. Unga murojaat qilish uchun <errno.h> faylini ulashingiz mumkin, strerror(errno) esa xato kodini o‘qiladigan xabarga aylantiradi:
Misol: strerror()
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
FILE *f = fopen("nothing.txt", "r");
if (f == NULL) {
printf("Error: %s\n", strerror(errno));
return 1;
}
fclose(f);
return 0;
}
Natija:
Error: No such file or directory
Keng tarqalgan xato kodlari
Xato konstantalari <errno.h> faylida aniqlangan. Muayyan muammolarni aniqlash uchun errno qiymatini ular bilan solishtirishingiz mumkin:
| Xato kodi | Ma’nosi |
|---|---|
ENOENT | Bunday fayl yoki katalog mavjud emas |
EACCES | Ruxsat berilmagan |
ENOMEM | Xotira yetarli emas |
EINVAL | Noto‘g‘ri argument |
Misol: ENOENT uchun maxsus xabar
#include <stdio.h>
#include <errno.h>
int main() {
FILE *f = fopen("nothing.txt", "r");
if (f == NULL) {
if (errno == ENOENT) {
printf("The file was not found.\n");
} else {
printf("Some other file error occurred.\n");
}
return 1;
}
fclose(f);
return 0;
}
Natija:
The file was not found.
Dasturni exit() yordamida to‘xtatish
Agar xato yuz berganda dasturni darhol to‘xtatmoqchi bo‘lsangiz, exit() funksiyasidan foydalanishingiz mumkin. U operatsion tizimga holat kodini qaytarish imkonini beradi.
Chiqish kodlari dastur muvaffaqiyatli yoki xato bilan yakunlanganini bildirishga yordam beradi, masalan:
0muvaffaqiyatni bildiradi- Noldan farqli qiymatlar (masalan,
1yokiEXIT_FAILURE) xatolarni bildiradi
Misol: xato yuz berganda exit() funksiyasidan foydalanish
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *f = fopen("nothing.txt", "r");
if (f == NULL) {
printf("Failed to open file.\n");
exit(1);
}
fclose(f);
return 0;
}
Natija:
Failed to open file.
Keng tarqalgan chiqish holati kodlari
| Kod | Ma’nosi |
|---|---|
| 0 | Muvaffaqiyat - dastur odatdagidek yakunlandi |
| 1 | Xato - nimadir noto‘g‘ri ketdi |
| EXIT_SUCCESS | 0 bilan bir xil (<stdlib.h> faylida aniqlangan) |
| EXIT_FAILURE | Noldan farqli xato kodi bilan bir xil (u ham <stdlib.h> faylida) |
Maslahat: Kodingizni o‘qish osonroq bo‘lishi uchun sonlar o‘rniga EXIT_SUCCESS va EXIT_FAILURE konstantalaridan foydalanishingiz mumkin.
Misol: EXIT_FAILURE va EXIT_SUCCESS konstantalaridan foydalanish
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *f = fopen("nothing.txt", "r");
if (f == NULL) {
perror("Could not open nothing.txt");
exit(EXIT_FAILURE); // More readable than exit(1)
}
fclose(f);
return EXIT_SUCCESS;
}
Natija:
Could not open nothing.txt: No such file or directory
Xulosa
- Ko‘plab C funksiyalari biror narsa noto‘g‘ri ketganda
NULLqaytaradi - Xato haqida xabar chiqarish uchun
perror()funksiyasidan foydalaning - Xato xabarini string ko‘rinishida olish uchun
strerror(errno)funksiyasidan foydalaning errnooxirgi muvaffaqiyatsiz amalning xato kodini saqlaydierrnoqiymatiniENOENT(fayl topilmadi) yokiENOMEM(xotira yetarli emas) kabi qiymatlar bilan solishtirishingiz mumkin- Xato yuz bersa, dasturni muddatidan oldin to‘xtatish uchun
exit()funksiyasidan foydalaning
Maslahat: Fayl amallari, xotira ajratish va tizim chaqiruvlaridan keyin har doim xatolarni tekshiring. Xatolarga e’tibor bermaslik kutilmagan xatti-harakatlarga yoki dasturning ishdan chiqishiga olib kelishi mumkin.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
