Sobes.tech
Middle+

İstisnaların təhlükəsizlik zəmanətləri haqqında nə bilirsiniz?

sobes.tech Süni İntellekt

AI-dan cavab

İstisna təhlükəsizliyi zəmanətləri, funksiyanın istisna baş verdiyi halda davranışını müəyyən edir. Dörd səviyyə ayırd edilir:

  1. Əsas zəmanət (Basic guarantee): Əgər funksiya istisna atarsa, proqram düzgün vəziyyətdə qalır. Resurslar itmir (məsələn, yaddaş azad edilir), lakin obyektlərin dəqiq vəziyyəti məlum olmaya bilər. Proqramla işləməyə davam etmək imkanı saxlanılır.

    // Əsas zəmanət nümunəsi
    void basic_guarantee_function(std::vector<int>& vec, int value) {
        // İstisna baş verə bilər
        vec.push_back(value); 
        // Əgər istisna baş verərsə, vec qeyri-müəyyən vəziyyətdə ola bilər (qismən dəyişmiş),
        // lakin vec üçün ayrılmış yaddaş düzgün şəkildə azad ediləcək.
    } 
    
  2. Güclü zəmanət (Strong guarantee): Əgər funksiya istisna atarsa, proqramın vəziyyəti əvvəlki kimi qalır. Bütün dəyişikliklər geri alınır.

    // Güclü zəmanət nümunəsi
    // Güclü zəmanəti təmin etmək üçün Copy-and-Swap idiomundan istifadə olunur
    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); // İstisna ata bilər
        }
        Resource& operator=(Resource other) // Dəyər transferi
        {
            swap(*this, other); // İstisna atmır
            return *this;
        }
        friend void swap(Resource& first, Resource& second) noexcept {
            using std::swap;
            swap(first.data, second.data);
            swap(first.size, second.size);
        }
        // ... digər üzvlər
    };
    
    void strong_guarantee_function(Resource& res, size_t new_size) {
        Resource temp(new_size); // Əgər burada istisna baş verərsə, res dəyişməz
        res = temp;               // Yüklənmiş operator= istifadə olunur, bu güclü zəmanəti təmin edir
    }
    
  3. İstisna atmama zəmanəti (No-throw guarantee): Funksiya heç vaxt istisna atmaz. Belə funksiyalar noexcept spesifikatoru ilə qeyd olunur.

    // İstisna atmama nümunəsi
    void no_throw_function() noexcept {
        // İstisna ata biləcək əməliyyatlar yoxdur
        int a = 5;
        int b = 10;
        int c = a + b;
    }
    
  4. Uğursuzluq zəmanəti (Failure guarantee): İstisna təhlükəsizliyi kontekstində, bəzən bu səviyyə qeyd olunur, yəni funksiya proqramı qeyri-müəyyən vəziyyətə sala bilər, resurs sızması və ya səhvlər baş verə bilər. Bu, faktiki olaraq zəmanətlərin olmamasıdır. Belə davranışdan qaçınmaq tövsiyə olunur.

İstisna təhlükəsizliyi zəmanətlərinin əhəmiyyəti, etibarlı və proqnozlaşdırıla bilən kod yaratmaqdır ki, bu da səhvləri və resursları düzgün idarə edir, hətta istisnalar baş verərsə belə. Gərəyən zəmanət səviyyəsi əməliyyatın kritikliyindən, geri alma xərclərindən və istisna ehtimalından asılıdır.

Zəmanətlərin müqayisəli cədvəli:

Zəmanət İstisna baş verdikdə vəziyyət Məlumatların bütövlüyü Resurs sızmaları
Əsas Düzgün, lakin qeyri-müəyyən Garantilənmir Yox
Güclü Dəyişməz (əvvəlki kimi) Saxlanılır Yox
İstisnasız Heç vaxt baş verməz (istənilən istisna yoxdur) N/A N/A
Uğursuzluq (yox) Qeyri-müəyyən, zərər və ya səhvlər ola bilər Garantilənmir Ola bilər