İ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:
-
Ə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. } -
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 } -
İstisna atmama zəmanəti (No-throw guarantee): Funksiya heç vaxt istisna atmaz. Belə funksiyalar
noexceptspesifikatoru 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; } -
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 |