Назад к вопросам
Middle
85
questionbank

Что нужно сделать, чтобы выбрасывать исключения из конструктора?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Для выбрасывания исключения из конструктора ничего специального делать не нужно. Стандартный механизм throw работает в конструкторах, как и в обычных функциях.

При выбрасывании исключения из конструктора:

  1. Объекты, инициализированные до точки выброса исключения, будут уничтожены в обратном порядке их создания.
  2. Члены объекта, инициализированные до точки выброса исключения, будут уничтожены.
  3. Базовые классы, подчасти которых были успешно инициализированы, будут корректно уничтожены.
  4. Память, выделенная для объекта, будет освобождеена (если объект создавался динамически с использованием new).
  5. Сам объект считается некорректно сконструированным, и его деструктор вызываться не будет, если исключение было выброшено до полного завершения конструктора.

Пример:

#include <stdexcept> // Для std::runtime_error
#include <iostream>

class MyClass {
public:
    int value_;

    MyClass(int val) : value_(val) {
        std::cout << "Constructor called for MyClass with value: " << value_ << std::endl;
        if (value_ < 0) {
            throw std::runtime_error("Value cannot be negative"); // Выбрасываем исключение
        }
    }

    ~MyClass() {
        std::cout << "Destructor called for MyClass with value: " << value_ << std::endl;
        // Деструктор не будет вызван, если конструктор не завершился успешно
    }
};

int main() {
    try {
        MyClass obj1(10); // Конструируется успешно
        // Дальнейшие действия с obj1
        MyClass obj2(-5); // Выбрасывает исключение
        // Этот код никогда не будет выполнен
    } catch (const std::runtime_error& e) {
        std::cerr << "Caught exception: " << e.what() << std::endl;
    }

    return 0;
}