logo

Exception sinf interfeysi. Standart istisno xolatlar bilan ishlash

Yuklangan vaqt:

20.11.2024

Ko'chirishlar soni:

0

Hajmi:

143.4541015625 KB
Exception sinf interfeysi. Standart istisno xolatlar
bilan ishlash
Reja:
1. Istisno holatlar va exception sinfi haqida nazariy ma'lumot
2. Exception sinfini implementatsiya qilish
3. Standart istisno holatlari bilan ishlash
4. Xulosa Istisno Holatlari (Exceptions)
Istisno   holatlar,   dasturchi   tomonidan   dastur   bajarilayotgan   paytda   yuzaga
kelishi   kutilaydigan   xatolar   yoki   istisno   holatlar   hisoblanadi.   Masalan,   massiv
indeksini   tashqi   cheklov   bilan   o'tkazish,   nolga   bo'lib   bo'lmagan   bo'lish,   fayl   ochish
muvaffaqiyatsizligi kabi holatlar istisno holatlarga misol bo'lishi mumkin.
Exception Sinfi
C++ dasturlash tilida istisno holatlarni boshqarish uchun   std::exception
sinfi   va   uning   undiradigan   sinflari   mavjud.   Bu   sinflarning   asosiy   vazifalari   istisno
holatlarni ro'yxatga olish, ularning xususiyatlarini yoritish va ma'lumot berishdir.
Misollar
1-Misol: Massiv Indeksi
Quyidagi  misolda,  bir   massivdan  indeksi  tashqi   cheklov  bilan  o'tkazish   natijasida   std::out_of_range
istisno holati yuzaga keladi:
#include <iostream>
#include <vector>
using namespace std; 
int main() {
    vector<int> v = {1, 2, 3, 4, 5};
    try {
        int index = 10;  // Tashqi cheklov
        int value = v.at(index);  // `at()` metodi tashqi cheklovni aniqlab chiqadi
        cout << "Indeksdagi qiymat " << index << " u : " << value << endl;
    }
    catch (const out_of_range& e) {
        cerr << "Istisno chegaradan tashqarida ushlandi: " << e.what() << endl;
    }
    return 0;
} e.what()   funksiyasi   C++   istisno   obyektlari   uchun   muhim   bo'lib,   unda   xatolik   haqida   ma'lumotni
qaytaradi. Bu funksiya istisno obyektining xatolik haqida matn xatolarini o'z ichiga oladi.
dastur tahlili:
Bu   dasturda,   v.at(index)   qatorida   index   qiymati   massivning
o'lchamidan   katta   bo'lsa,   out_of_range   istisno   holati   yuzaga   keladi   va   qo'llab-
quvvatlovchi   kod   ushbu   holatni   tutadi.
2-Misol. Fayl Ochish Misoli
Quyidagi   misolda,   fayl   ochish   jarayonida   std::ifstream   sinfi   va   uning
undiradigan   istisno   holatlaridan   foydalanish   ko'rsatilgan:
#include <iostream>
#include <iostream>
#include <fstream>
using namespace std;
int main() {
    try {
        ifstream file("mavjudemasfayl.txt"); // Fayl ochish urinishi
        if (!file) {
                       throw ios_base::failure("Faylni ochishda xatolik yuz berdi."); // Fayl
ochilmadi
        }
        // Faylga ma'lumotlarni o'qish yoki yozish jarayoni
    }
    catch (const ios_base::failure& e) {                cerr  << "ios_base::failure istisno holati  qo'lga olindi:  " << e.what()  <<
endl;
    }
    return 0;
}
Bu   misolda,   std::ifstream   sinfi   fayl   ochish   jarayonida
std::ios_base::failure   istisno   holatini   yuzaga   keltiradi.   Agar   fayl   mavjud
bo'lmasa   yoki   ochilmay   bo'lsa,   istisno   holati   yuzaga   kelayapti.
“   try   “     bloki   ichida   bajarilishi   kerak   bo'lgan   amallar   joylashadi,   bu   amallar   istisno   holat   yuzaga
kelgandagina "tushunuvchi" bloklar (catch bloklari) ichida qo'llaniladi.
“ catch “  bloklarida istisno obyektini qabul qilib, istisno holati haqida ma'lumot chiqarish mumkin.
“ throw ”  operatori bilan istisno holat yaratish mumkin.
                                            Exception Sinfini Implementatsiya Qilish
Maxsus istisno sinfini yaratish usullari:   C++ tilida istisno sinfini yaratish uchun odatda 
mavjud  std::exception  sinfidan meros olish tavsiya etiladi. Bu sizning yangi istisno sinfingizni C++ 
istisno tizimi bilan mos qilish imkonini beradi.
Exception sinfini yozishda eng yaxshi amaliyotlar:
Yangi istisno sinfini yozishda asosan quyidagi nuqtalarga e'tibor berish kerak:
 Konstruktorlar:   Istisno   sinfini   yaratilishida   kerakli   xatolik   xabarini   qabul   qilish   va   saqlash   uchun
konstruktor yozing.

 what()  funksiyasi:  Xatolik haqida ma'lumot qaytarish uchun  what()  funksiyasini qayta yozing.

 Meros   olish:   std::exception   yoki   uning   boshqa   hosilalaridan   (masalan,
std::runtime_error ) meros oling. Misol: Oddiy istisno sinfini yaratish
#include <iostream>
#include <exception>
#include <string>
using namespace std;
class MyException : public exception {
private: string message;
public:
    MyException(const string& msg) : message(msg) {}
    virtual const char* what() const noexcept override {
        return message.c_str();
    }
};
int main() {
    try {
        throw MyException("Bu maxsus xatolik xabari");
    } catch (const MyException& e) {
        cout << "Istisno qo'lga olindi: " << e.what() << endl;
    }    
return 0;
}
Foydalanuvchi xatolarini ushlash va ularni to'g'ri ishlatish: #include <iostream>
#include <exception>
#include <string>
using namespace std;
class InvalidInputException : public exception {
private:
    string message;
public:
    InvalidInputException(const std::string& msg) : message(msg) {}
    virtual const char* what() const noexcept override {
        return message.c_str();
    }
};
int main() {
    try {
        int age;
        cout << "Yoshingizni kiriting: ";
        cin >> age;
        if (age < 0) {
            throw InvalidInputException("Yosh manfiy bo'lishi mumkin emas");
        }
        cout << "Sizning yoshingiz: " << age << endl;
    } catch (const InvalidInputException& e) {
        cout << "Xatolik: " << e.what() << endl;
    }
    return 0;
} Fayl ochishdagi xatolikni ushlash
#include <iostream>
#include <fstream>
#include <exception>
using namespace std;
class FileOpenException : public exception {
private:
    string message;
public:
    FileOpenException(const string& msg) : message(msg) {}
    virtual const char* what() const noexcept override {
        return message.c_str();
    }
};
int main() {
    try {
        ifstream file("mavjudemasfayl.txt"); // Fayl ochish urinishi
        if (!file) {                         throw   FileOpenException("Faylni   ochishda   xatolik   yuz   berdi.");   //   Fayl
ochilmadi
        }
        // Faylga ma'lumotlarni o'qish yoki yozish jarayoni
    }
    catch (const FileOpenException& e) {
        cerr << "Istisno qo'lga olindi: " << e.what() << endl;
    }
    return 0;
}
Standart Istisno Holatlari Bilan Ishlash
C++ tilida ko'plab standart istisno sinflari mavjud bo'lib, ularning har biri turli xil xatoliklarni boshqarish 
uchun mo'ljallangan. Quyida ba'zi eng keng tarqalgan standart istisno sinflarini va ularning ishlatilishini 
misollar bilan ko'rib chiqamiz.
1. “std::exception” Bu barcha standart istisnolar uchun asosiy sinf hisoblanadi. Barcha boshqa istisno sinflari
undan meros oladi.
#include <iostream>
#include <exception> int main() {
    try {
        throw std::exception();
    } catch (const std::exception& e) {
        std::cerr << "Umumiy istisno qo'lga olindi: " << e.what() << std::endl;
    }
    return 0;
}
Ushbu   kodda   std::exception   istisnosi   qasddan   tashlanmoqda   va   catch   bloki   orqali   qo'lga
olinmoqda.   e.what()   funksiyasi   istisno   haqida   ma'lumotni   qaytaradi   va   "std::exception"   xabarini   chop
etadi.
2.  “std::runtime_error”
Bu sinf bajarilish vaqtida yuzaga keladigan xatoliklarni ifodalaydi.
#include <iostream>
#include <stdexcept>
int main() {
    try {
        throw std::runtime_error("Runtime error yuz berdi");
    } catch (const std::runtime_error& e) {
        std::cerr << "Runtime error qo'lga olindi: " << e.what() << std::endl;
    }
    return 0; }
Ushbu kodda  std::runtime_error  istisnosi qasddan tashlanmoqda va  catch  bloki orqali qo'lga 
olinmoqda.  e.what()  funksiyasi istisno haqida ma'lumotni qaytaradi va "Runtime error yuz berdi" 
xabarini chop etadi.
3.  std::logic_error
Bu sinf dasturdagi mantiqiy xatoliklarni ifodalaydi.
#include <iostream> #include <stdexcept>
int main() {
    try {
        throw std::logic_error("Logic error yuz berdi");
        }   catch   (const   std::logic_error&   e)   {   std::cerr   <<   "Logic   error   qo'lga   olindi:   "   <<   e.what()   <<
std::endl;}return   0;}
4.
std::out_of_range
Bu sinf indeksning ruxsat etilgan chegaradan tashqarida ekanligini bildiradi.
#include <iostream>
#include <vector>
int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};     try {
        int index = 10; // Tashqi cheklov
        int value = v.at(index); // `at()` metodi tashqi cheklovni aniqlab chiqadi
        std::cout << "Indexdagi qiymat: " << value << std::endl;
    } catch (const std::out_of_range& e) {
        std::cerr << "Out of range istisno qo'lga olindi: " << e.what() << std::endl;
    }
    return 0;
}
Ushbu  kodda   std::vector   ning   at()   metodi   orqali   mavjud  bo'lmagan   indeksga  murojaat   qilingan   va
natijada   std::out_of_range   istisnosi   tashlangan.   catch   bloki   orqali   ushbu   istisno   qo'lga   olinib,
xatolik haqida ma'lumot chiqarilgan.
5.  std::invalid_argument
Bu sinf noto'g'ri argument berilganligini bildiradi.
#include <iostream>
#include <stdexcept>
int kvadratIldiz(int son) {
    if (son < 0) {
        throw std::invalid_argument("Manfiy sonning kvadrat ildizini olish mumkin emas");
    }
    return sqrt(son); }
int main() {
    try {
        int natija = kvadratIldiz(-4);
    } catch (const std::invalid_argument& e) {
        std::cerr << "Invalid argument istisno qo'lga olindi: " << e.what() << std::endl;
    }
return 0;
}
Xulosa
     Istisno   sinflari   C++   dasturlash   tillarida   muhim   qism,   chunki   ular   dasturning
xatoliklarini   aniqlash   va   to'g'ri   foydalanish   uchun   foydalaniladi.   Bu   sinflarni   to'g'ri
amalga   oshirish   dasturning   soddaligini   va   dasturchining   kodni   yaxshi   strukturasini
ta'minlash.   Istisno   gunohlarini   to'g'ri   xatolar,   xato   manbalari   bilan   ishlash   va   dastur
dastur moslamalarni juda yordam uchun. Foydalanilgan adabiyotlar ro yxatiʻ
1.   Ахо ,   Альфред ,   В .,   Хопкрофт ,   Джон ,   Ульман ,   Джеффри ,   Д .     Структуры
данных и алгоритмы.: Пер. с англ.: Уч. Пос. – М.  Издательский дом «Вильямс»,
2000. – 384 с.: ил. – Парал.  Титю англ.
  2.   To ‘ rayev   H . T .   Matematik   mantiq   va   diskret   matematika .:   Oliy   ta ’ lim
muassasalarining   talabalari   uchun   darslik : 11  jildlik .  H . T .    To ‘ rayev , 1.  Azizov ;  H . T .
To ' rayevning   umumiy   tahriri   ostida ;     O ‘ zR   Oliy   va   o ‘ rta - maxsus   ta ’ lim   vazirligi .   -
Toshkent :   Tafakkur - Bo ‘ stoni , 2011. - 288  bet
3.   Клейнберг   Дж.,   Тардос   Е.   К48   Алгоритмы:   разработка   и     применение.
Классика   Computers   Science   / Пер. с англ. Е.   Матвеева.  — СПб.:  Питер, 2016.
— 800 с.: ил. — (Серия  «Классика  computer   science »). 4. Пышкин Е.В. Структуры данных и алгоритмы: реализация    на   C / C ++. -
СПб.: ФТК СПБГПУ, 2009.- 200 с., ил.
5.   Овсянников,   А.   В.   Алгоритмы   и   структуры   данных   :   учебно-
методический   комплекс   для   специальности   1-31   03   07     «Прикладная
информатика (по направлениям)». Ч. 1 / А. В.
6. Домнин Л. Н. Элементы теории графов: учеб. Пособие / Л.  Н. Домнин. –
Пенза: Изд-во Пенз. Гос.  Ун-та, 2007. – 144 с.
Internet tarmoqlari:
1. https://uzbekdevs.uz/darsliklar/cpp/cpp-da-sinflar-obektlar   
2. https://uzbekdevs.uz/darsliklar/cpp/cpp-da-funksiya    .

Exception sinf interfeysi. Standart istisno xolatlar bilan ishlash Reja: 1. Istisno holatlar va exception sinfi haqida nazariy ma'lumot 2. Exception sinfini implementatsiya qilish 3. Standart istisno holatlari bilan ishlash 4. Xulosa

Istisno Holatlari (Exceptions) Istisno holatlar, dasturchi tomonidan dastur bajarilayotgan paytda yuzaga kelishi kutilaydigan xatolar yoki istisno holatlar hisoblanadi. Masalan, massiv indeksini tashqi cheklov bilan o'tkazish, nolga bo'lib bo'lmagan bo'lish, fayl ochish muvaffaqiyatsizligi kabi holatlar istisno holatlarga misol bo'lishi mumkin. Exception Sinfi C++ dasturlash tilida istisno holatlarni boshqarish uchun std::exception sinfi va uning undiradigan sinflari mavjud. Bu sinflarning asosiy vazifalari istisno holatlarni ro'yxatga olish, ularning xususiyatlarini yoritish va ma'lumot berishdir. Misollar 1-Misol: Massiv Indeksi Quyidagi misolda, bir massivdan indeksi tashqi cheklov bilan o'tkazish natijasida std::out_of_range istisno holati yuzaga keladi: #include <iostream> #include <vector> using namespace std; int main() { vector<int> v = {1, 2, 3, 4, 5}; try { int index = 10; // Tashqi cheklov int value = v.at(index); // `at()` metodi tashqi cheklovni aniqlab chiqadi cout << "Indeksdagi qiymat " << index << " u : " << value << endl; } catch (const out_of_range& e) { cerr << "Istisno chegaradan tashqarida ushlandi: " << e.what() << endl; } return 0; }

e.what() funksiyasi C++ istisno obyektlari uchun muhim bo'lib, unda xatolik haqida ma'lumotni qaytaradi. Bu funksiya istisno obyektining xatolik haqida matn xatolarini o'z ichiga oladi. dastur tahlili: Bu dasturda, v.at(index) qatorida index qiymati massivning o'lchamidan katta bo'lsa, out_of_range istisno holati yuzaga keladi va qo'llab- quvvatlovchi kod ushbu holatni tutadi. 2-Misol. Fayl Ochish Misoli Quyidagi misolda, fayl ochish jarayonida std::ifstream sinfi va uning undiradigan istisno holatlaridan foydalanish ko'rsatilgan: #include <iostream> #include <iostream> #include <fstream> using namespace std; int main() { try { ifstream file("mavjudemasfayl.txt"); // Fayl ochish urinishi if (!file) { throw ios_base::failure("Faylni ochishda xatolik yuz berdi."); // Fayl ochilmadi } // Faylga ma'lumotlarni o'qish yoki yozish jarayoni } catch (const ios_base::failure& e) {

cerr << "ios_base::failure istisno holati qo'lga olindi: " << e.what() << endl; } return 0; } Bu misolda, std::ifstream sinfi fayl ochish jarayonida std::ios_base::failure istisno holatini yuzaga keltiradi. Agar fayl mavjud bo'lmasa yoki ochilmay bo'lsa, istisno holati yuzaga kelayapti. “ try “ bloki ichida bajarilishi kerak bo'lgan amallar joylashadi, bu amallar istisno holat yuzaga kelgandagina "tushunuvchi" bloklar (catch bloklari) ichida qo'llaniladi. “ catch “ bloklarida istisno obyektini qabul qilib, istisno holati haqida ma'lumot chiqarish mumkin. “ throw ” operatori bilan istisno holat yaratish mumkin. Exception Sinfini Implementatsiya Qilish Maxsus istisno sinfini yaratish usullari: C++ tilida istisno sinfini yaratish uchun odatda mavjud std::exception sinfidan meros olish tavsiya etiladi. Bu sizning yangi istisno sinfingizni C++ istisno tizimi bilan mos qilish imkonini beradi. Exception sinfini yozishda eng yaxshi amaliyotlar: Yangi istisno sinfini yozishda asosan quyidagi nuqtalarga e'tibor berish kerak:  Konstruktorlar: Istisno sinfini yaratilishida kerakli xatolik xabarini qabul qilish va saqlash uchun konstruktor yozing.   what() funksiyasi: Xatolik haqida ma'lumot qaytarish uchun what() funksiyasini qayta yozing.   Meros olish: std::exception yoki uning boshqa hosilalaridan (masalan, std::runtime_error ) meros oling.

Misol: Oddiy istisno sinfini yaratish #include <iostream> #include <exception> #include <string> using namespace std; class MyException : public exception { private: string message; public: MyException(const string& msg) : message(msg) {} virtual const char* what() const noexcept override { return message.c_str(); } }; int main() { try { throw MyException("Bu maxsus xatolik xabari"); } catch (const MyException& e) { cout << "Istisno qo'lga olindi: " << e.what() << endl; } return 0; } Foydalanuvchi xatolarini ushlash va ularni to'g'ri ishlatish: