Здравствуйте, Sm0ke, Вы писали:
S>Сам clear() напрямую ничего не кидает. Но в нём set и list могут бросить.
Ну да, это и имел в виду. Вместо try-catch надо сделать scope guard, который в конструкторе запомнит std::uncaught_exceptions() перед вызовом clear, а после, в своем деструкторе, почистит что надо, если счетчик std::uncaught_exceptions() увеличился.
Пример такой штуки есть в
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4152.pdf