Exception sinf interfeysi. Standart istisno xolatlar bilan ishlash
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: