У меня есть класс, который использует RAII для очистки на случай, если что-то пойдет не так. Это означает, что класс содержит флаг, который сообщает ему, была ли работа завершена, и если этот флаг не установлен при вызове конструктора, он выполняет свои задачи очистки и создает сообщения журнала. Теперь я хотел бы, чтобы этот класс стал на один шаг умнее, т.е. он должен был бы выяснить, произошла ли ошибка из-за того, что работа была прервана (т.е. было выброшено исключение и был вызван деструктор) или потому что кто-то неправильно использовал этот класс и никогда фактически закончил работу. Это означает, что мне нужно будет узнать в деструкторе, активно ли исключение. Если он будет найден, я создам сообщение журнала, возможно, распечатав содержимое исключения, а затем повторно выдав его. Я предполагаю что-то вроде этого.
Foo::~Foo () {
try { /* do not know what to put here */ }
catch( const std::exception & ex ) {
// produce error in log
throw;
}
catch( ... ) {
// produce some other log message
throw;
}
}
Однако я не уверен, что это вообще сработает, поскольку исключение активно уже до вызова деструктора и не происходит из блока try
. Также я использую throw;
внутри деструктора, и создание исключения в этот момент - действительно плохая идея. Поэтому я бы не стал этого делать, если только стандарт четко не гарантирует, что этот случай является исключением (без каламбура) из этого правила (которого я не знаю).
Так это вообще возможно, или я должен поступить в этой ситуации как-то по-другому?