Sobes.tech
Junior

რა არის გამონაკლისები C++-ში?

sobes.tech AI

პასუხი AI-სგან

მექანიზმი ანომალური სიტუაციების (შეცდომების), რომლებიც წარმოიქმნება პროგრამის შესრულების დროს, დამუშავებისთვის. საშუალებას იძლევა კოდი, რომელიც პასუხს აგებს პროგრამის ლოგიკისთვის, გამოეყოს შეცდომების დამუშავების კოდიდან.

საკვანძო სიტყვები:

  • try: განსაზღვრავს კოდის ბლოკს, სადაც შეიძლება წარმოიშვას გამონაკლისი.
  • catch: განსაზღვრავს კოდის ბლოკს, რომელიც შესრულდება გარკვეული ტიპის გამონაკლისის წარმოქმნისას.
  • throw: ქმნის (წარმოადგენს) გამონაკლისს. გამონაკლისის ტიპი შეიძლება იყოს ნებისმიერი ობიექტი.

სამუშაო პრინციპი:

  1. კოდი, რომელიც შეიძლება გამოიწვიოს შეცდომა, მოთავსებულია try ბლოკში.
  2. თუ try ბლოკში წარმოიქმნება გამონაკლისი (მომსახურეობით throw), ჩვეულებრივი პროგრამის შესრულება შეწყდება.
  3. სისტემა ეძებს შესაბამის catch ბლოკს, რომელიც შეძლებს დამუშავდეს წარმოქმნილი გამონაკლისი (ტიპით).
  4. თუ იპოვება შესაბამისი catch, მისი კოდი შესრულდება.
  5. თუ მიმდინარე დონეზე შესაბამისი catch არ იპოვება, გამონაკლისი "გავრცელდება" ზემოთ, ფუნქციების ზოლზე, სანამ არ იპოვება შესაბამისი დამუშავების ფუნქცია (ან პროგრამა დასრულდება არასწორად).

მაგალითი:

#include <iostream>
#include <stdexcept> // სტანდარტული ტიპების გამონაკლისებისთვის

int divide(int a, int b) {
    if (b == 0) {
        throw std::runtime_error("Division by zero!"); // გამონაკლისის წარმოქმნა
    }
    return a / b;
}

int main() {
    try {
        int result = divide(10, 0); // ფუნქციის გამოძახება, რომელიც შეიძლება გამოიწვიოს გამონაკლისი
        std::cout << "Result: " << result << std::endl; // ეს ხაზი არ შესრულდება
    } catch (const std::runtime_error& e) { // გამონაკლისის დაჭერა ტიპის std::runtime_error
        std::cerr << "Error: " << e.what() << std::endl; // გამონაკლისის დამუშავება
    } catch (...) { // ნებისმიერი სხვა გამონაკლისის დაჭერა
        std::cerr << "An unknown error occurred." << std::endl;
    }

    std::cout << "Program continues after error handling." << std::endl;
    return 0;
}

უპირატესობები:

  • ლოგიკის და შეცდომების დამუშავების განცალკევება.
  • ძირითადი ნაკადის გამარტივება.
  • შეცდომების დამუშავების შესაძლებლობა სხვადასხვა დონეზე:

მოხერხებულობა:

  • შეიძლება გავლენა მოახდინოს შესრულებაზე (სტეკის გაფართოების გამო).
  • გამარტივებული არ არის ნაკადის გაგება, როდესაც მრავალი გამონაკლისია.
  • არასწორი გამოყენება შეიძლება გამოიწვიოს რესურსების გაჟონვა (თუ რესურსები არ განთავისუფლდა გამონაკლისის წარმოქმნის დროს, სანამ ისინი სწორად არ განთავისუფლდება).

უსაფრთხო მუშაობისთვის რესურსებთან გამონაკლისების არსებობისას, ხშირად გამოიყენება RAII (Resource Acquisition Is Initialization) და ჭკვიანი მაჩვენებლები.