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:
-
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ī: } -
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 } -
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; } -
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 |