Назад к вопросам
Middle
85
questionbank
Что нужно сделать, чтобы выбрасывать исключения из конструктора?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Для выбрасывания исключения из конструктора ничего специального делать не нужно. Стандартный механизм throw работает в конструкторах, как и в обычных функциях.
При выбрасывании исключения из конструктора:
- Объекты, инициализированные до точки выброса исключения, будут уничтожены в обратном порядке их создания.
- Члены объекта, инициализированные до точки выброса исключения, будут уничтожены.
- Базовые классы, подчасти которых были успешно инициализированы, будут корректно уничтожены.
- Память, выделенная для объекта, будет освобождеена (если объект создавался динамически с использованием
new). - Сам объект считается некорректно сконструированным, и его деструктор вызываться не будет, если исключение было выброшено до полного завершения конструктора.
Пример:
#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;
}