C xatolarni qayta ishlash


ULASHISH

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 kodiMa’nosi
ENOENTBunday fayl yoki katalog mavjud emas
EACCESRuxsat berilmagan
ENOMEMXotira yetarli emas
EINVALNoto‘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:

  • 0 muvaffaqiyatni bildiradi
  • Noldan farqli qiymatlar (masalan, 1 yoki EXIT_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

KodMa’nosi
0Muvaffaqiyat - dastur odatdagidek yakunlandi
1Xato - nimadir noto‘g‘ri ketdi
EXIT_SUCCESS0 bilan bir xil (<stdlib.h> faylida aniqlangan)
EXIT_FAILURENoldan 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 NULL qaytaradi
  • Xato haqida xabar chiqarish uchun perror() funksiyasidan foydalaning
  • Xato xabarini string ko‘rinishida olish uchun strerror(errno) funksiyasidan foydalaning
  • errno oxirgi muvaffaqiyatsiz amalning xato kodini saqlaydi
  • errno qiymatini ENOENT (fayl topilmadi) yoki ENOMEM (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!