Darsliklar C try-except va try-finally

C C try-except va try-finally

try-except va try-finally — xatolarni boshqarish mavzusi. Muhim haqiqat: standart C tilida try-catch mexanizmi yo’q — u C++ va boshqa tillarga xos. Biroq C’da xatolarni boshqarishning o’z usullari bor: qaytariladigan qiymatlarni tekshirish, errno va Windows’dagi maxsus try-except. Bu darsda C’ga xos yondashuvlarni ko’ramiz.

Xatolarni boshqarish (C’da)C’da xatolar odatda funksiyaning qaytish qiymati va errno global o’zgaruvchisi orqali aniqlanadi. Windows’da esa strukturaviy istisnolar (SEH) __try/__except bilan ishlaydi.

C’ning asosiy usuli: qiymatni tekshirish

C’da xatoni ushlashning asosiy yo’li — funksiya qaytargan qiymatni tekshirish. Masalan, fopen xato bo’lsa NULL qaytaradi:

#include <stdio.h>

int main(void) {
    FILE *fayl = fopen("yoq.txt", "r");
    if (fayl == NULL) {
        printf("Xato: fayl ochilmadi\n");
        return 1;
    }
    fclose(fayl);
    return 0;
}
Xato: fayl ochilmadi

Bu — C’da xato boshqarishning eng keng tarqalgan naqshi: har bir xavfli amaldan keyin natijani tekshirish. Dastur qulamaydi, xatoni oqilona qayta ishlaydi.

errno bilan xato sababini bilish

errno.h kutubxonasi global errno o’zgaruvchisini beradi — u oxirgi xato kodini saqlaydi. perror esa uni matn sifatida chiqaradi:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main(void) {
    FILE *fayl = fopen("yoq.txt", "r");
    if (fayl == NULL) {
        printf("Xato: %s\n", strerror(errno));
        return 1;
    }
    fclose(fayl);
    return 0;
}
Xato: No such file or directory

strerror(errno) xato kodini tushunarli matnga aylantirdi. Bu foydalanuvchiga aniq sabab ko’rsatishda foydali.

Windows: __try va __except

Windows platformasida Microsoft kompilyatori strukturaviy istisnolarni (SEH) qo’llab-quvvatlaydi:

#include <stdio.h>

int main(void) {
    __try {
        int *ptr = NULL;
        *ptr = 10;   /* xato: NULL ga yozish */
    }
    __except(1) {
        printf("Istisno ushlandi!\n");
    }
    return 0;
}
Istisno ushlandi!

__try blokida xavfli kod, __except da esa xatoga javob yoziladi. Diqqat: bu faqat Windows/MSVC’da ishlaydi, standart C’ning qismi emas.

Yondashuvlarni solishtirish

C’dagi xato boshqarish usullarini jadvalda ko’ramiz:

Usul Platform Xususiyati
Qaytish qiymati barcha standart, universal
errno barcha xato sababini beradi
__try/__except faqat Windows strukturaviy istisno

Portativ (barcha tizimda ishlaydigan) kod uchun qaytish qiymati va errno afzal.

Xulosa

Bu bo’limda C’da xato boshqarishni — qaytish qiymatini tekshirish, errno/strerror va Windows’dagi __try/__except — ko’rib chiqdik. Standart C’da try-catch yo’q; xatolar qiymatlar orqali boshqariladi. Keyingi darsda ma’lumotlar bazasi bilan ishlashga o’tamiz.