В проекте, который я пишу, используется автоматическое включение вывода в лог, если из функции класса вылетело исключение — все следующие вызовы к этому классу логгируются до некоторых более-менее хитрых условий остановки (эти критерии — отдельная тема, не важно). Сейчас это включение флагов — наполовину RAII, наполовину с ручным приводом. Хочется написать класс, который в деструкторе будет взводить bool debug, если деструктор вызван в процессе разматывания стека из-за исключения (if (std::uncaught_exception())).
Но исключения бывают разные: например, std::logic_error, std::bad_alloc и, среди прочих, std::runtime_error. Последние не должны взводить этот флаг, потому что runtime_error — не ошибка программы, её не надо отлаживать, это просто некорректные данные.
Можно ли как-то в процессе разматывания стека выяснить, какое же исключение является тем std::uncaught_exception()?
Можно говорить что-то вроде
Код: Выделить всё
auto_flag.Cancel();
throw runtime_error("bad data, sorry master!");но это опять наполовину ручное решение — нужно каждый раз не забыть сказать флагу, чтобы он не взводился, а заодно и ловить все прилетающие такие исключения, отключать флаг и вызывать throw, что уж совсем бессмысленный лишний код.
Неужели в C++ нельзя до конца использовать RAII?