Sobes.tech
Middle+

Ko jūs zināt par izņēmumu drošības garantijām?

sobes.tech AI

Atbilde no AI

Drošības garantijas nosaka funkcijas uzvedību izņēmuma gadījumā. Pastāv četri garantiju līmeņi:

  1. Pamata garantija (Basic guarantee): Ja funkcija izmet izņēmumu, programma paliek derīgā stāvoklī. Resursi netiek zaudēti (piemēram, atmiņa tiek atbrīvota), bet objektu precīzais stāvoklis var būt nezināms. Turpināt darbu ar programmu ir iespējams:

    // Pamata garantijas piemērs
    void basic_guarantee_function(std::vector<int>& vec, int value) {
        // Iespējams, notiks izņēmums pie ievietošanas
        vec.push_back(value); 
        // Ja notiek izņēmums, vec var būt nenoteiktā stāvoklī (daļēji mainīts),
        // bet atmiņa, kas piešķirta vec, tiek pareizi atbrīvota iziešanas brīdī:
    } 
    
  2. Stingra garantija (Strong guarantee): Ja funkcija izmet izņēmumu, programmas stāvoklis paliek tāds pats kā pirms izsaukuma. Visi izmaiņas tiek atceltas:

    // Stingras garantijas piemērs
    // Izmanto Copy-and-Swap metodi garantijas nodrošināšanai
    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); // Iespējams, notiks izņēmums
        }
        Resource& operator=(Resource other) // Pārsūtīšana ar vērtību, kas rada kopiju
        {
            swap(*this, other); // Neizraisa izņēmumu
            return *this;
        }
        friend void swap(Resource& first, Resource& second) noexcept {
            using std::swap;
            swap(first.data, second.data);
            swap(first.size, second.size);
        }
        // ... citas funkcijas
    };
    
    void strong_guarantee_function(Resource& res, size_t new_size) {
        Resource temp(new_size); // Ja šeit notiek izņēmums, res nemainīsies
        res = temp;               // Izmanto pārrakstīto operatoru =, kas nodrošina stingru garantiju
    }
    
  3. Bez izņēmumu garantija (No-throw guarantee): Funkcija garantēti neizmet izņēmumu. Šādas funkcijas tiek atzīmētas ar noexcept:

    // Bez izņēmumu garantijas piemērs
    void no_throw_function() noexcept {
        // Nav operāciju, kas varētu izraisīt izņēmumu
        int a = 5;
        int b = 10;
        int c = a + b;
    }
    
  4. Neveiksmes garantija (Failure guarantee): Izņēmumu drošības kontekstā, šis līmenis nozīmē, ka funkcija var atstāt programmu nenoteiktā stāvoklī, var būt resursu noplūde vai kļūdas. Tas faktiski ir garantiju neesamība. Šādu uzvedību būtu jāizvairās:

Izņēmumu drošības garantiju nozīme ir uzticama un prognozējama koda izveidē, kas pareizi apstrādā kļūdas un pārvalda resursus pat izņēmuma gadījumā. Izvēlētā garantiju līmeņa izvēle ir atkarīga no operācijas kritiskuma, atjaunošanas izmaksām un izņēmuma rašanās varbūtības:

Salīdzinoša tabula par garantijām:

Garantija Stāvoklis izņēmuma gadījumā Datu integritāte Resursu noplūde
Pamata Derīga, bet nenoteikta Nav garantēta Nav
Stingra Nemainīta (kā pirms) Saglabājas Nav
Bez izņēmumu Nekad nenotiek (nav izņēmumu) N/A N/A
Neveiksmes (nav) Nenoteikta, iespējama bojājums vai kļūdas Nav garantēta Iespējama