Sobes.tech
Middle+

Ką žinote apie išimčių saugumo garantijas?

sobes.tech AI

Atsakymas iš AI

Atsitiktinių išimčių saugumo garantijos apibrėžia funkcijos elgesį išimties atveju. Yra keturi garantijų lygiai:

  1. Pagrindinė garantija (Basic guarantee): Jei funkcija išmeta išimtį, programa lieka galiojančioje būklėje. Ištekliai nėra prarandami (pavyzdžiui, atmintis atlaisvinama), tačiau objektų tiksli būklė gali būti nežinoma. Galima toliau dirbti su programa:

    // Pagrindinės garantijos pavyzdys
    void basic_guarantee_function(std::vector<int>& vec, int value) {
        // Gali įvykti išimtys įterpiant
        vec.push_back(value); 
        // Jei įvyko išimtis, vec gali būti nenuspėjamos būklės (dalinai pakeistas),
        // tačiau atmintis, skirta vec, bus tinkamai atlaisvinta išeinant iš bloko:
    } 
    
  2. Griežta garantija (Strong guarantee): Jei funkcija išmeta išimtį, programos būklė lieka tokia pati kaip prieš iškvietimą. Visi pakeitimai atšaukiami:

    // Griežtos garantijos pavyzdys
    // Naudojame Copy-and-Swap metodą garantijai užtikrinti
    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); // Gali įvykti išimtis
        }
        Resource& operator=(Resource other) // Perduoda reikšmę, sukurdama kopiją
        {
            swap(*this, other); // Nėra išimčių
            return *this;
        }
        friend void swap(Resource& first, Resource& second) noexcept {
            using std::swap;
            swap(first.data, second.data);
            swap(first.size, second.size);
        }
        // ... kiti nariai
    };
    
    void strong_guarantee_function(Resource& res, size_t new_size) {
        Resource temp(new_size); // Jei čia įvyksta išimtis, res nesikeis
        res = temp;               // Naudojame perrašytą operatorių =, kuris užtikrina griežtą garantiją
    }
    
  3. Išimčių nebuvimo garantija (No-throw guarantee): Funkcija garantuotai ne išmes išimties. Tokios funkcijos žymimos noexcept specifieriu:

    // Išimčių nebuvimo pavyzdys
    void no_throw_function() noexcept {
        // Nėra operacijų, kurios galėtų išmesti išimtį
        int a = 5;
        int b = 10;
        int c = a + b;
    }
    
  4. Klaidos garantija (Failure guarantee): Išimčių saugumo kontekste, šis lygis reiškia, kad funkcija gali palikti programą nenuspėjamoje būklėje, gali būti išteklių praradimas arba klaidos. Tai iš esmės yra garantijų nebuvimas. Tokio elgesio reikėtų vengti:

Išimčių saugumo garantijų svarba yra kuriant patikimą ir prognozuojamą kodą, kuris tinkamai tvarko klaidas ir valdo išteklius net ir išimčių atveju. Pasirinktas garantijų lygis priklauso nuo operacijos kritiškumo, atstatymo kainos ir išimties tikimybės:

Lyginamoji lentelė apie garantijas:

Garantija Būklė išimties atveju Duomenų vientisumas Išteklių praradimas
Pagrindinė Galioja, bet nenuspėjama Neužtikrinama Nėra
Griežta Nepakitusi (kaip prieš) Išlaikoma Nėra
Išimčių nebuvimas Niekada nevyksta (jokių išimčių) N/A N/A
Klaidos (nevyksta) Nenuspėjama, galimas pažeidimas ar klaidos Neužtikrinama Gali būti