Скажем, у меня есть класс RAII:
class Raii {
Raii() {};
~Raii() {
if (<something>) throw std::exception();
}
};
И если у меня есть функция:
void foo() {
Raii raii;
if (something) {
throw std::exception();
}
}
Это плохо, потому что при очистке первого исключения мы можем выбросить снова, и это завершит процесс.
Мой вопрос: какой хороший шаблон для использования raii для кода, который может вызвать очистка?
Например, хорошо это или плохо - почему?
class Raii {
Raii() {};
~Raii() {
try {
if (<something>) throw std::exception();
}
catch (...) {
if (!std::uncaught_exception())
throw;
}
}
};
Обратите внимание, что объект Raii всегда является объектом, размещенным в стеке, и это не общая проблема деструктора.