Исправьте имя деструктора на ~A, восстановите скобки try/catch и уберите исключение из деструктора. Тогда внешний throw 32 будет нормально перехвачен, и программа выведет 32.
Найдите и исправьте ошибки в приведённой программе
Исправьте имя деструктора на ~A, восстановите скобки try/catch и уберите исключение из деструктора. Тогда внешний throw 32 будет нормально перехвачен, и программа выведет 32.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В следующем фрагменте кода присутствуют синтаксические и логические ошибки, из‑за которых программа не компилируется и не работает корректно. Исправьте их, чтобы код успешно собирался и выполнялся.
# include <iostream>
class A {
public:
A() {}
^A() {
throw 42;
}
};
int main(int argc, const char * argv[]) {
try {
A a; [
throw 32;
catch(int a) {
std::cout << a;
}
}
Ответ
Исправьте имя деструктора на ~A, восстановите скобки try/catch и уберите исключение из деструктора. Тогда внешний throw 32 будет нормально перехвачен, и программа выведет 32.
#include <iostream>
class A {
public:
A() = default;
~A() noexcept = default;
};
int main() {
try {
A object;
throw 32;
} catch (int value) {
std::cout << value;
}
}
Одна лишь правка синтаксиса недостаточна: throw 42 из деструктора при обработке throw 32 приводит к std::terminate. Даже noexcept(false) не делает такую ситуацию безопасной; очистка должна завершаться без выходящего исключения.