Sobes.tech
Middle+

Siz istisnolar xavfsizlik kafolatlari haqida nima bilasiz?

sobes.tech AI

AIdan javob

Istisno xavfsizlik kafolatlari funksiyaning istisno yuzaga kelganda qanday harakat qilishini belgilaydi. To'rt darajadagi kafolat ajratiladi:

  1. Asosiy kafolat (Basic guarantee): Agar funksiya istisno chiqaradigan bo'lsa, dastur valid holatda qoladi. Resurslar yo'qolmaydi (masalan, xotira bo'shatiladi), lekin ob'ektlarning aniq holati noma'lum bo'lishi mumkin. Dastur bilan ishlash imkoniyati saqlanadi.

    // Asosiy kafolat misoli
    void basic_guarantee_function(std::vector<int>& vec, int value) {
        // Insertion vaqtida istisno yuzaga kelishi mumkin
        vec.push_back(value); 
        // Agar istisno yuz bersa, vec noaniq holatda bo'lishi mumkin (qisman o'zgargan),
        // lekin vec uchun ajratilgan xotira to'g'ri bo'shatiladi.
    } 
    
  2. Mustahkam kafolat (Strong guarantee): Agar funksiya istisno chiqaradigan bo'lsa, dastur holati avvalgi holatga qaytadi. Barcha o'zgarishlar bekor qilinadi.

    // Mustahkam kafolat misoli
    // Copy-and-Swap idiomidan foydalanamiz
    class Resource {
        int* data;
        size_t size;
    public:
        Resource(size_t s) : size(s), data(new int[s]) {}
        ~Resource() { delete[] data; }
        Resource(const Resource& other) : size(other.size), data(new int[other.size]) {
            std::copy(other.data, other.data + size, data); // Istisno chiqarishi mumkin
        }
        Resource& operator=(Resource other) {
            swap(*this, other); // Istisno chiqarmaydi
            return *this;
        }
        friend void swap(Resource& first, Resource& second) noexcept {
            using std::swap;
            swap(first.data, second.data);
            swap(first.size, second.size);
        }
        // ... boshqa a'zolar
    };
    
    void strong_guarantee_function(Resource& res, size_t new_size) {
        Resource temp(new_size); // Agar istisno yuz bersa, res o'zgarmaydi
        res = temp; // Mustahkam kafolatni ta'minlaydigan overloaded operator=
    }
    
  3. Istisno chiqarmaslik kafolati (No-throw guarantee): Funksiya istisno chiqarishiga kafolat bermaydi. Bunday funksiyalar noexcept bilan belgilangan.

    // Istisno chiqarmaslik misoli
    void no_throw_function() noexcept {
        // Istisno chiqarishi mumkin bo'lgan operatsiyalar yo'q
        int a = 5;
        int b = 10;
        int c = a + b;
    }
    
  4. Xatolik kafolati (Failure guarantee): Istisno xavfsizligi kontekstida, ba'zan bu daraja tilga olinadi, bu funksiyaning dastur holatini noma'lum holatga qoldirishi, resurslar oqishi yoki xatoliklar bilan yakunlanishi mumkinligini anglatadi. Bu, aslida, kafolatlarning yo'qligi. Bunday xatti-harakatlardan qochish kerak.

Istisno xavfsizlik kafolatlarining ahamiyati, xatolar va resurslarni to'g'ri boshqaradigan, ishonchli va bashoratli kod yaratishda yotadi. G'ayriqoidalar darajasi operatsiyaning kritikligi, qaytarish xarajatlari va istisno yuzaga kelish ehtimoliga bog'liq.

Kafolatlar taqqoslash jadvali:

Kafolat Istisno yuzaga kelganda holat Ma'lumotlarning yaxlitligi Resurslar oqishi
Asosiy Valid, lekin noma'lum Garantiyalanmaydi Yo'q
Mustahkam O'zgarmagan (qo'ng'iroqdan oldingi kabi) Saqlanadi Yo'q
Kafolat yo'q Hech qachon yuzaga kelmaydi (istisno yo'q) N/A N/A
Xato (kafolatsiz) Noma'lum, mumkin bo'lgan zarar yoki xatoliklar Garantiyalanmaydi Mümkin