Основная проблема с бросанием исключений из деструктора заключается в том, что в момент, когда деструктор называется другим исключением, может быть "в полете" (std::uncaught_exception() == true
), и поэтому неясно, что делать в этом случае. "Перезаписать" старое исключение с новым было бы одним из возможных способов справиться с этой ситуацией. Но было решено, что в таких случаях нужно вызывать std::terminate
(или другое std::terminate_handler
).
В С++ 11 реализована функция вложенных исключений через класс std::nested_exception
. Эта функция может быть использована для решения проблемы, описанной выше. Старое (непонятое) исключение может быть просто вложено в новое исключение (или наоборот?), А затем может быть выбрано вложенное исключение. Но эта идея не использовалась. std::terminate
все еще вызывается в такой ситуации в С++ 11 и С++ 14.
Итак, вопросы. Была ли рассмотрена идея с вложенными исключениями? Есть ли проблемы с этим? Не изменится ли ситуация на С++ 17?