Sobes.tech
Middle

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

sobes.tech AI

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

ობიექტებით. როდესაც throw-ით გამონაკლისს ვაგდებთ, იქმნება დროებითი ობიექტი, რომელიც შემდეგ გადაეცემა გამონაკლისების მართვის მექანიზმს. ამ ობიექტის ტიპი განსაზღვრავს, რომელი catch დამუშავებელი აირჩევა.

აქ არის მაგალითი, რომელიც აჩვენებს, როგორ ინახება გამონაკლისები ობიექტის სახით:

#include <iostream>
#include <stdexcept>

class MyException {
    int error_code;
public:
    MyException(int code) : error_code(code) {}
    int get_code() const { return error_code; }
};

void test_func(int val) {
    if (val < 0) {
        // გამონაკლისის გამოტანა - MyException კლასი ობიექტი
        throw MyException(-1);
    }
    if (val == 0) {
        // სტანდარტული გამონაკლისის გამოტანა - std::runtime_error კლასი ობიექტი
        throw std::runtime_error("მნიშვნელობა არ უნდა იყოს ნული.");
    }
    std::cout << "მნიშვნელობა დადებითი: " << val << std::endl;
}

int main() {
    try {
        test_func(-5);
    } catch (const MyException& e) {
        // გამონაკლისის დაჭერა MyException ტიპით
        std::cerr << "MyException დაჭერილია, კოდი: " << e.get_code() << std::endl;
    } catch (const std::runtime_error& e) {
        // გამონაკლისის დაჭერა std::runtime_error ტიპით
        std::cerr << "std::runtime_error დაჭერილია: " << e.what() << std::endl;
    } catch (...) {
        // ნებისმიერი სხვა გამონაკლისის დაჭერა
        std::cerr << "უცნობი გამონაკლისი დაჭერილია." << std::endl;
    }

    try {
        test_func(0);
    } catch (const std::exception& e) {
        // შეიძლება დაჭერით სტანდარტული გამონაკლისის კლასი
        std::cerr << "სტანდარტული გამონაკლისი დაჭერილია: " << e.what() << std::endl;
    }

    return 0;
}