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:
-
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. } -
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= } -
Istisno chiqarmaslik kafolati (No-throw guarantee): Funksiya istisno chiqarishiga kafolat bermaydi. Bunday funksiyalar
noexceptbilan 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; } -
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 |