У меня есть класс, который использует 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;
внутри деструктора, и на этом этапе я получаю исключение - это действительно плохая идея.Так что я бы не стал этого делать, если только стандарт четко не гарантирует, что этот случай является исключением (без каламбура) из этого правила (чего я не знаю).
Так возможно ли это вообще или должноЯ как-то справляюсь с этой ситуацией?